как добавить столбец с вложенными элементами в фрейм данных из других столбцов (withColumn)

У меня есть фреймворк PySpark, который выглядит как

C C1 C2 C3
1 2  3  4

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

C C1 C2 C3  V
1 2  3  4   {"C:1", "C1:2", "C2:3", "C3:4"}

Я пробовал Как добавить вложенный столбец в DataFrame но я не знаю, каков правильный синтаксис в PySpark, в отличие от этого вопроса, который представляет собой Scala, и это решение выглядит так, что оно будет работать только для 1 строки, мне нужно сделать это для сотен миллионов строк.

Я пробовал df2 = df.withColumn("V", struct("V.*", col("C1").as('C1'))), но это дает загадочную синтаксическую ошибку.

Изменить: я бы не сказал, что этот вопрос является дубликатом строки преобразования pyspark в json с нулями, потому что решение, которое было опубликовано здесь пользователем и которое решило мою проблему, не публикуется там.

Как я могу сделать этот вложенный столбец V из остальных столбцов в той же строке?


person con    schedule 30.11.2018    source источник
comment
as - ключевое слово в Python. Используйте alias - col("C1").alias('C1')   -  person 10465355    schedule 30.11.2018
comment
это то, что вы ищете?   -  person pault    schedule 30.11.2018
comment
@pault это не дубликат, потому что решение на этой странице не то, что я хочу, Пользователь sailesh решил мою проблему. Его решение не отображается на этой странице. Кроме того, я удаляю строки с нулевыми значениями. Нулевые значения здесь не важны.   -  person con    schedule 30.11.2018


Ответы (1)


В PySpark вы можете добиться, используя struct. Псевдоним не нужен.

df.withColumn("V", struct(col("C"), col("C1"), col("C2"), col("C3"))

Если вы не хотите жестко кодировать имена столбцов, вы также можете сделать

df.withColumn("V", struct(col("*"))
person Sailesh Kotha    schedule 30.11.2018
comment
Использование этого метода с последующим преобразованием в JSON не будет работать правильно для значений null. - person pault; 30.11.2018