#apache-spark #apache-spark-sql #spark-dataframe
#apache-spark #apache-spark-sql
Вопрос:
Давайте предположим, что у меня есть файл JSON, назовем его foo, со следующим содержимым: {«a»: 2, «b»: 3}
Моя цель — записать секционированные данные на основе столбца «a».
Затем из моего кода я делаю что-то вроде этого:
DataFrame df = sqlContext.read().json("foo");
df.write().mode(SaveMode.Append).partitionBy("a").json("output");
Все в порядке, и на выходе я получаю следующую структуру:
output
|
|-->a=2
|-> part-blahblah
Когда я проверяю содержимое part-blahblah, в содержимом отсутствует поле «a».
Мой вопрос в том, есть ли какой-либо способ контролировать это поведение (с помощью опций или кода), чтобы сохранить столбец разделения (чтобы созданный файл содержал как a, так и b, а не только b). Причина этого в том, что я хочу загрузить данные из других приложений, которые не поддерживают разделение, и они не могут определить схему разделения. Я думал скопировать поле a в «_a» и разбить на «_a», но это не элегантно и создает проблемы.
Спасибо!
Комментарии:
1. «Причина этого в том, что я хочу загрузить данные из других приложений, которые не поддерживают разделение, и они не могут определить схему разделения», Но схема разделения может быть выведена из структуры каталогов / имен другим приложением? Я не думаю, что есть другой способ (кроме дублирования вашего столбца с другим именем)
2. к сожалению, это невозможно. в некоторых случаях я загружаю каталоги рекурсивно и загружаю объекты, поэтому структура каталогов отсутствует.
Ответ №1:
Вы должны дублировать столбец, по которому вы разделяете.
В PySpark
from pyspark.sql import functions as F
df = df.withColumn("a_partition", F.col("a"))
df.write().mode(SaveMode.Append).partitionBy("a_partition").json("output");