Фрейм данных SparkSQL сохраняет столбцы разделения

#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");