Отбрасывать столбцы разделов при написании паркета в pyspark - PullRequest
0 голосов
/ 24 июня 2019

У меня есть датафрейм со столбцом даты.Я разобрал его на столбцы год, месяц, день.Я хочу разделить эти столбцы, но не хочу, чтобы столбцы сохранялись в файлах паркета.

Вот мой подход к разбиению и записи данных:

df = df.withColumn('year', f.year(f.col('date_col'))).withColumn('month',f.month(f.col('date_col'))).withColumn('day',f.dayofmonth(f.col('date_col')))

df.write.partitionBy('year','month', 'day').parquet('/mnt/test/test.parquet')

Это правильносоздает файлы паркета, включая структуру вложенных папок.Однако мне не нужны столбцы года, месяца или дня в файлах паркета.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Spark / Hive не будет записывать year,month,day столбцы в вашем parquet files, поскольку они уже есть в partitionBy предложении .

Пример:

val df=Seq((1,"a"),(2,"b")).toDF("id","name")
df.coalesce(1).write.partitionBy("id").csv("/user/shu/temporary2") //write csv file.

Проверка содержимого CSV-файла:

hadoop fs -cat /user/shu/temporary2/id=1/part-00000-dc55f08e-9143-4b60-a94e-e28b1d7d9285.c000.csv

Выход:

a

Как видите, в файл csv включено no id value, точно так же, если вы пишете parquet file столбцы разделов не входит в состав - *. паркетный файл.


Для проверки схемы файла паркета:

parquet-tools schema <hdfs://nn:8020/parquet_file>

Вы также можете проверить, какие столбцы включены в ваш файл паркета.

1 голос
/ 25 июня 2019

Если вы используете df.write.partitionBy('year','month', 'day').

Эти столбцы не фактически физически хранятся в данных файла.Они просто отображаются через структуру папок, которую создает partitionBy.

Пример.partitionBy('year').csv("/data") создаст что-то вроде:

/data/year=2018/part1---.csv
/data/year=2019/part1---.csv

Когда вы читаете данные обратно, он использует специальный путь year=xxx для заполнения этих столбцов.

Вы можете доказать это, прочитав вданные одного раздела напрямую.

Пример.year не будет столбцом в этом случае.

df = spark.read.csv("data/year=2019/")
df.printSchema()

Также ответ @ Шу может быть использован для расследования.

Вы можете спокойно спать, так как эти столбцы не занимают места для хранения.


Если вы действительно не хотите просто видеть столбцы, вы можете поместить представление поверх этой таблицы, исключающее эти столбцы.

...