在PySPARK中使用从其他所有列创建的值创建一个列作为JSON

我有一个如下数据框:

+----------+----------+--------+
|     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
morenming 回答:在PySPARK中使用从其他所有列创建的值创建一个列作为JSON

请考虑使用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来说,这是相同的逻辑,您只需要使用两种编程语言中都可用的spark SQL函数即可。

我希望这会有所帮助

,

scala 解决方案:

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

pyton 解决方案:(我不知道该如何像在scala中那样处理n-cols,因为pyspark中不存在map_from_arrays

    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"} |
    +-------------------------------------------+


,

使用以下方式实现:

df.withColumn("VALUE",to_json(struct([df[x] for x in df.columns])))
本文链接:https://www.f2er.com/3144362.html

大家都在问