小编Ven*_*pan的帖子

了解用 parquet-tools“meta”命令打印的 Parquet 文件的元数据信息

我正在学习 Parquet File 的内部表示过程,因此我通过 Apache Parquet 的 Github页面、Google Dremel 的论文来了解定义和重复级别以及 Twitter 的博客来了解有关 Parquet 文件的更多信息。

为了将我通过阅读获得的其表示形式的理解与实际的 Parquet 文件表示形式联系起来,我对示例 Parquet 文件之一使用了parquet-tools带选项的命令meta,并打印了包含 3 个主要部分的详细信息:标题、文件架构和行组。我理解前两部分中提供的详细信息,但我无法完全理解行组部分中提供的所有详细信息。

以下是我的问题。

  1. 想更多地了解DO, FPO, VC(这看起来像当前行组中所有行的计数)是什么。它所代表的含义的扩展可以在 parquet-tools Github页面中找到,但我想了解更多有关它的详细信息。我明白什么SZ是和ST是什么。
  2. 接下来ENC我看到编码方案列表,例如BIT_PACKED, PLAIN, RLE。我理解它各自的含义,但我不明白为什么总是使用至少 3 种编码方案。
  3. 在行组的记录计数RC和总大小旁边,我看到。对于第一页,它始终是 4。是怎么计算的?TSOFFSET
  4. 我发现Parquet文件的页眉和页脚有4位魔术代码“PAR1”,它有什么特殊含义吗?或者只是一些任意文本来决定文件是否为 Parquet(不依赖于文件扩展名)。

不幸的是,由于安全限制,我无法附加parquet-tools meta命令输出的片段,但我希望它不会太形象化我在每个问题中的意思。

apache-spark parquet dremel

5
推荐指数
1
解决办法
2745
查看次数

控制 Spark 中的小数精度溢出

我们使用 Spark 2.4.x。

我们的除法运算之一存在精度损失,(69362.86 / 111862.86)这两个值在表中都定义为十进制(38,3)。当穿过直线时,它产生0.620070504187002,但当穿过火花时,它产生0.6200710。正如我们所看到的,spark 的结果有一个小数截断。阅读更多内容后,我们偶然发现了 Spark 故事SPARK-29123。注释要求我们设置参数spark.sql.decimalOperations.allowPrecisionLoss避免false精度损失。然而,同一个故事中还有另一个评论警告我们,当十进制值的精确表示不可能时,请注意 null。堆栈溢出线程没有讨论第二条评论中提到的警告。将此参数设置spark.sql.decimalOperations.allowPrecisionLossfalse并运行计算 (69362.86 / 111862.86) 结果0.620070504187002很好,但我们担心第二条评论中的警告。

根据源代码中规定的规则,除法精度和小数位数的值由以下公式确定。

Operation    Result Precision                        Result Scale
e1 / e2      p1 - s1 + s2 + max(6, s1 + p2 + 1)      max(6, s1 + p2 + 1)
Run Code Online (Sandbox Code Playgroud)

根据这些规则,我的精度是(38 -3 +3 + max(6,3 +38 +1)) => 80,规模是max(6,3 +38 +1) => …

decimal apache-spark apache-spark-sql

5
推荐指数
1
解决办法
3348
查看次数

如何使用 Pyspark 通过 SSH 隧道读取 MySQL 数据库?

我对 Pyspark 这种奇怪的行为感到困惑,但在互联网上找不到任何东西。

我们在专用网络中有一个 MySQL 集群,可以通过 SSH 隧道访问它。我正在尝试使用 Pyspark 和 SSHTunnelForwarder 从该数据库读取数据,我这样做是这样的:

  1. 创建隧道:
server = SSHTunnelForwarder(
        (target_tunnel_ip_address, 22),
        ssh_username=tunnel_username",
        ssh_private_key=private_key_filepath",
        remote_bind_address=(mysql_address, 3306)
        )

server.start()
Run Code Online (Sandbox Code Playgroud)
  1. 使用数据库信息创建 JDBC URL,如下所示:
hostname = "localhost" #Because I forwarded I forwarded the remote port to my localhost
port = server.local_bind_port #To access which port the SSHTunnelForwarder used
username = my_username
password = my_password
database = my_database
jdbcUrl = "jdbc:mysql://{}:{}/{}?user={}&password={}".format(hostname, port, database, username, password)
Run Code Online (Sandbox Code Playgroud)
  1. 从数据库中读取数据:
data = spark.read \
                  .format("jdbc") \
                  .option("url", jdbcUrl) \
                  .option("driver", "com.mysql.cj.jdbc.Driver") \ …
Run Code Online (Sandbox Code Playgroud)

mysql apache-spark pyspark

5
推荐指数
1
解决办法
1557
查看次数