Python 2.7 PySpark写入带有统计信息的拼花地板二进制列(signed-min-max.enabled)

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")

我找到了这张apache拼花票,它标记为
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
中设置此conf
parquet.strings.signed-min-max.enabled
(或者已设置,但出现了其他问题)

  • 是否可以从pyspark配置
    拼花地板mr
  • pyspark 2.3.x是否支持二进制列统计
  • 如何利用PARQUET-686特性为PARQUET文件中的字符串列添加
    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)