簡體   English   中英

具有統計信息的PySpark Write Parquet Binary列(帶符號-最小-最大啟用)

[英]PySpark Write Parquet Binary Column with Stats (signed-min-max.enabled)

我發現這張apache-parquet票證https://issues.apache.org/jira/browse/PARQUET-686被標記為parquet-mr 1.8.2已解決。 我想要的功能是( stringBINARY )列的實木復合地板元數據中計算出的min/max

並引用此為電子郵件https://lists.apache.org/thread.html/%3CCANPCBc2UPm+oZFfP9oT8gPKh_v0_BF0jVEuf=Q3d-5=ugxSFbQ@mail.gmail.com%3E ,該電子郵件使用scala而不是pyspark作為示例:

  Configuration conf = new Configuration(); + conf.set("parquet.strings.signed-min-max.enabled", "true"); Path inputPath = new Path(input); FileStatus inputFileStatus = inputPath.getFileSystem(conf).getFileStatus(inputPath); List<Footer> footers = ParquetFileReader.readFooters(conf, inputFileStatus, false); 

我一直無法在pyspark設置此值(也許我在錯誤的位置設置了它?)


示例數據框

import random
import string
from pyspark.sql.types import StringType    

r = []
for x in range(2000):
    r.append(u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10)))

df = spark.createDataFrame(r, StringType())

我嘗試了幾種其他方法來設置此選項:

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

但是所有已保存的鑲木地板文件都缺少BINARY列的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
---------------------------------------------------------------------------------------------------

另外,根據此電子郵件鏈https://mail-archives.apache.org/mod_mbox/spark-user/201410.mbox/%3C9DEF4C39-DFC2-411B-8987-5B9C33842974@videoamp.com%3E和問題: 指定鑲木地板物業pyspark

我嘗試通過pyspark私有API潛入配置:

spark.sparkContext._jsc.hadoopConfiguration().setBoolean("parquet.strings.signed-min-max.enabled", True)

因此,我仍然無法在parquet-mr設置此conf parquet.strings.signed-min-max.enabled (或已設置,但其他地方出了問題)

  1. 是否可以從pyspark配置parquet-mr
  2. pyspark 2.3.x是否支持BINARY列統計信息?
  3. 如何利用PARQUET-686功能為鑲木地板文件中的字符串列添加min/max元數據?

由於歷史上Parquet編寫者為UTF-8字符串編寫的min / max值錯誤,因此除非設置parquet.strings.signed-min-max.enabled ,否則新的Parquet實現會在讀取過程中跳過這些統計信息。 因此,此設置是一個選項,它告訴Parquet庫信任已知的最小/最大值,盡管它們存在已知的不足。 可以安全啟用此設置的唯一情況是字符串僅包含ASCII字符,因為這些字符的對應字節永遠不會為負。

由於您使用parquet-tools來轉儲統計信息,而parquet-tools本身使用了Parquet庫,因此默認情況下它將忽略字符串最小/最大統計信息。 盡管文件中似乎沒有最小值/最大值,但實際上它們存在,但會被忽略。

PARQUET-1025是解決此問題的合適方法,它引入了新的統計字段min-valuemax-value 這些可以正確處理UTF-8字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM