Создайте столбец со значениями, созданными из всех других столбцов в виде JSON в PySPARK - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть следующий кадр данных:

+----------+----------+--------+
|     FNAME|     LNAME|     AGE| 
+----------+----------+--------+
|      EARL|     JONES|      35|
|      MARK|      WOOD|      20|
+----------+----------+--------+

Я пытаюсь добавить новый столбец в качестве значения для этого кадра данных, который должен быть таким:

+----------+----------+--------+------+------------------------------------+
|     FNAME|     LNAME|     AGE|                            VALUE          |
+----------+----------+--------+-------------------------------------------+
|      EARL|     JONES|      35|{"FNAME":"EARL","LNAME":"JONES","AGE":"35"}|
|      MARK|      WOOD|      20|{"FNAME":"MARK","WOOD":"JONES","AGE":"20"} |
+----------+----------+--------+-------------------------------------------+

Я не являюсьв состоянии достичь этого, используя withColumn или любую функцию json.

Любая поддержка будет приветствоваться.

Spark: 2.3
Python: 3.7.x

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

scala решение:

  val df2 = df.select(
    to_json(
      map_from_arrays(lit(df.columns), array('*))
    ).as("value")
  )

pyton решение: (Я не знаю, как это сделать для n-cols, как в scala, потому что map_from_arrays не существует в pyspark)

    import pyspark.sql.functions as f

    df.select(f.to_json(
        f.create_map(f.lit("FNAME"), df.FNAME, f.lit("LNAME"), df.LNAME, f.lit("AGE"), df.AGE)
        ).alias("value")
    ).show(truncate=False)

вывод :

    +-------------------------------------------+
    |value                                      |
    +-------------------------------------------+
    |{"FNAME":"EARL","LNAME":"JONES","AGE":"35"}|
    |{"FNAME":"MARK","LNAME":"WOOD","AGE":"20"} |
    +-------------------------------------------+


1 голос
/ 07 ноября 2019

Пожалуйста, рассмотрите возможность использования функции SQL to_json, которую вы можете найти в org.apache.spark.sql.functions

Вот решение:

df.withColumn("VALUE", to_json(struct($"FNAME", $"LNAME", $"AGE"))

И вы также можете избежатьуказав имена столбцов следующим образом:

df.withColumn("VALUE", to_json(struct(df.columns.map(col): _*)

PS: предоставленный мною код написан на scala, но это та же логика для Python, вам просто нужно использовать искровой SQLфункция, которая доступна на обоих языках программирования.

Надеюсь, это поможет,

0 голосов
/ 07 ноября 2019

Достигается с использованием:

df.withColumn("VALUE", to_json(struct([df[x] for x in df.columns])))
...