【发布时间】:2020-07-03 15:24:29
【问题描述】:
我正在尝试使用 delta 编码编写镶木地板文件。 This page,声明 parquet 支持三种 delta 编码:
(DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY).
由于spark、pyspark 或pyarrow 不允许我们指定编码方式,我很好奇如何编写启用了delta 编码的文件?
但是,我在互联网上发现,如果我有 TimeStamp 类型的列,parquet 将使用增量编码。
所以我在scala 中使用了以下代码来创建拼花文件。但编码不是增量。
val df = Seq(("2018-05-01"),
("2018-05-02"),
("2018-05-03"),
("2018-05-04"),
("2018-05-05"),
("2018-05-06"),
("2018-05-07"),
("2018-05-08"),
("2018-05-09"),
("2018-05-10")
).toDF("Id")
val df2 = df.withColumn("Timestamp", (col("Id").cast("timestamp")))
val df3 = df2.withColumn("Date", (col("Id").cast("date")))
df3.coalesce(1).write.format("parquet").mode("append").save("date_time2")
parquet-tools 显示以下有关写入 parquet 文件的信息。
file schema: spark_schema
--------------------------------------------------------------------------------
Id: OPTIONAL BINARY L:STRING R:0 D:1
Timestamp: OPTIONAL INT96 R:0 D:1
Date: OPTIONAL INT32 L:DATE R:0 D:1
row group 1: RC:31 TS:1100 OFFSET:4
--------------------------------------------------------------------------------
Id: BINARY SNAPPY DO:0 FPO:4 SZ:230/487/2.12 VC:31 ENC:RLE,PLAIN,BIT_PACKED ST:[min: 2018-05-01, max: 2018-05-31, num_nulls: 0]
Timestamp: INT96 SNAPPY DO:0 FPO:234 SZ:212/436/2.06 VC:31 ENC:RLE,BIT_PACKED,PLAIN_DICTIONARY ST:[num_nulls: 0, min/max not defined]
Date: INT32 SNAPPY DO:0 FPO:446 SZ:181/177/0.98 VC:31 ENC:RLE,PLAIN,BIT_PACKED ST:[min: 2018-05-01, max: 2018-05-31, num_nulls: 0]
如您所见,没有列使用增量编码。
我的问题是:
如何编写使用 delta 编码的 parquet 文件? (如果你可以的话 在
scala或python中提供一个示例代码会很棒。)如何决定使用哪个“增量编码”:
(DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY)?
【问题讨论】:
标签: scala apache-spark pyspark parquet pyarrow