PySpark Записать двоичную колонку паркета со статистикой (подписано-min-max.enabled)
Я нашел этот билет apache-parquet https://issues.apache.org/jira/browse/PARQUET-686 который помечен как разрешенный для parquet-mr
1.8.2. Функция, которую я хочу, это рассчитанная min/max
в метаданных паркета для (string
или же BINARY
) столбец.
И ссылка на это электронное письмо 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")
Но во всех сохраненных файлах паркета отсутствуют значения ST/STATS для столбца BINARY. Вот пример вывода метаданных из одного из файлов паркета:
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
Я попытался проникнуть через конфигурацию через частный API pyspark:
spark.sparkContext._jsc.hadoopConfiguration().setBoolean("parquet.strings.signed-min-max.enabled", True)
Поэтому я все еще не могу установить этот конф parquet.strings.signed-min-max.enabled
в parquet-mr
(или он установлен, но что-то пошло не так)
- Можно ли настроить
parquet-mr
из pyspark - Поддерживает ли pyspark 2.3.x статистику столбцов BINARY?
- Как использовать функцию PARQUET-686 для добавления
min/max
метаданные для строковых столбцов в файле паркета?
1 ответ
Поскольку исторически создатели Parquet записывали неверные значения min/max для строк UTF-8, новые реализации Parquet пропускают эту статистику во время чтения, если только parquet.strings.signed-min-max.enabled
установлено. Таким образом, этот параметр является опцией чтения, которая говорит библиотеке Parquet доверять значениям min/max, несмотря на их известный недостаток. Единственный случай, когда этот параметр можно безопасно включить, это если строки содержат только символы ASCII, потому что соответствующие байты для них никогда не будут отрицательными.
Так как вы используете parquet-tools
для сброса статистики и parquet-tools
сама использует библиотеку Parquet, по умолчанию она игнорирует строковую минимальную / максимальную статистику. Хотя кажется, что в файле нет минимальных / максимальных значений, в действительности они есть, но игнорируются.
Правильным решением этой проблемы является PARQUET-1025, который вводит новые поля статистики min-value
а также max-value
, Они правильно обрабатывают строки UTF-8.