Написать файл паркета с дельта-закодированными coulmns - PullRequest
2 голосов
/ 23 марта 2020

Я пытался написать файл паркета с дельта-кодировкой. На этой странице указано, что паркет поддерживает три типа дельта-кодирования:

    (DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY).

Поскольку spark, pyspark или pyarrow не позволяют нам указать метод кодирования, Мне было любопытно, как можно написать файл с включенным дельта-кодированием?

Однако я обнаружил в inte rnet, что если у меня есть столбцы с паркетом типа TimeStamp, то будет использоваться дельта-кодирование. Поэтому я использовал следующий код в 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 показывает следующую информацию относительно записанного файла паркета.

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]

Как видите, ни один столбец не использовал дельта-кодирование.

Мои вопросы:

  1. Как мне написать файл паркета с дельта-кодированием? (Если вы можете предоставить пример кода в scala или python, это было бы здорово.)

  2. Как решить, какую «дельта-кодировку»: (DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY) использовать?

...