Python 2.7 PySpark写入带有统计信息的拼花地板二进制列(signed-min-max.enabled)
我找到了这张apache拼花票,它标记为Python 2.7 PySpark写入带有统计信息的拼花地板二进制列(signed-min-max.enabled),python-2.7,apache-spark,pyspark,parquet,parquet-mr,Python 2.7,Apache Spark,Pyspark,Parquet,Parquet Mr,我找到了这张apache拼花票,它标记为parquet mr1.8.2的解析。我想要的功能是(string或BINARY)列的拼花地板元数据中计算的min/max 这是一封电子邮件 它使用scala而不是pyspark作为示例: 我尝试了几种设置此选项的不同方法: df.write.format("parquet").option("parquet.strings.signed-min-max.enabled", "true").save("s3a://test.bucket/option")
parquet mr
1.8.2的解析。我想要的功能是(string
或BINARY
)列的拼花地板元数据中计算的min/max
这是一封电子邮件
它使用scala
而不是pyspark
作为示例:
我尝试了几种设置此选项的不同方法:
df.write.format("parquet").option("parquet.strings.signed-min-max.enabled", "true").save("s3a://test.bucket/option")
df.write.option("parquet.strings.signed-min-max.enabled", "true").parquet("s3a://test.bucket/option")
df.write.option("parquet.strings.signed-min-max.enabled", True).parquet("s3a://test.bucket/option")
但是所有保存的拼花文件都缺少二进制列的ST/STATS。下面是一个来自拼花地板文件之一的元数据输出示例:
creator: parquet-mr version 1.8.3 (build aef7230e114214b7cc962a8f3fc5aeed6ce80828)
extra: org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"value","type":"string","nullable":true,"metadata":{}}]}
file schema: spark_schema
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
value: OPTIONAL BINARY O:UTF8 R:0 D:1
row group 1: RC:33 TS:515
---------------------------------------------------------------------------------------------------
此外,基于此电子邮件链和问题: 我试图通过pyspark私有API偷偷地进入配置:
spark.sparkContext._jsc.hadoopConfiguration().setBoolean("parquet.strings.signed-min-max.enabled", True)
因此,我仍然无法在parquet mr
中设置此confparquet.strings.signed-min-max.enabled
(或者已设置,但出现了其他问题)
拼花地板mr
min/max
元数据由于历史上拼花地板编写者为UTF-8字符串编写了错误的最小/最大值,新的拼花地板实现在读取期间跳过这些统计信息,除非设置了
Parquet.strings.signed-min-max.enabled
。因此,此设置是一个读取选项,它告诉拼花地板库信任最小/最大值,尽管它们存在已知的缺陷。唯一可以安全启用此设置的情况是字符串仅包含ASCII字符,因为这些字符的对应字节永远不会为负
由于您使用parquet tools
来转储统计信息,并且parquet tools
本身使用parquet库,因此默认情况下它将忽略字符串min/max统计信息。虽然文件中似乎没有最小/最大值,但实际上它们确实存在,但会被忽略
此问题的正确解决方案是,引入新的统计字段min-value
和max-value
。这些文件可以正确处理UTF-8字符串
creator: parquet-mr version 1.8.3 (build aef7230e114214b7cc962a8f3fc5aeed6ce80828)
extra: org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"value","type":"string","nullable":true,"metadata":{}}]}
file schema: spark_schema
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
value: OPTIONAL BINARY O:UTF8 R:0 D:1
row group 1: RC:33 TS:515
---------------------------------------------------------------------------------------------------
spark.sparkContext._jsc.hadoopConfiguration().setBoolean("parquet.strings.signed-min-max.enabled", True)