我正在学习 Parquet File 的内部表示过程,因此我通过 Apache Parquet 的 Github页面、Google Dremel 的论文来了解定义和重复级别以及 Twitter 的博客来了解有关 Parquet 文件的更多信息。
为了将我通过阅读获得的其表示形式的理解与实际的 Parquet 文件表示形式联系起来,我对示例 Parquet 文件之一使用了parquet-tools
带选项的命令meta
,并打印了包含 3 个主要部分的详细信息:标题、文件架构和行组。我理解前两部分中提供的详细信息,但我无法完全理解行组部分中提供的所有详细信息。
以下是我的问题。
DO
, FPO
, VC
(这看起来像当前行组中所有行的计数)是什么。它所代表的含义的扩展可以在 parquet-tools Github页面中找到,但我想了解更多有关它的详细信息。我明白什么SZ
是和ST
是什么。ENC
我看到编码方案列表,例如BIT_PACKED
, PLAIN
, RLE
。我理解它各自的含义,但我不明白为什么总是使用至少 3 种编码方案。RC
和总大小旁边,我看到。对于第一页,它始终是 4。是怎么计算的?TS
OFFSET
不幸的是,由于安全限制,我无法附加parquet-tools meta
命令输出的片段,但我希望它不会太形象化我在每个问题中的意思。
我们使用 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.allowPrecisionLoss
为false
并运行计算 (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) => …
我对 Pyspark 这种奇怪的行为感到困惑,但在互联网上找不到任何东西。
我们在专用网络中有一个 MySQL 集群,可以通过 SSH 隧道访问它。我正在尝试使用 Pyspark 和 SSHTunnelForwarder 从该数据库读取数据,我这样做是这样的:
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)
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)
data = spark.read \
.format("jdbc") \
.option("url", jdbcUrl) \
.option("driver", "com.mysql.cj.jdbc.Driver") \ …
Run Code Online (Sandbox Code Playgroud)