【问题标题】:How to update data frame column in Spark如何在 Spark 中更新数据框列
【发布时间】:2021-10-09 10:18:00
【问题描述】:

我有一个数据框,其中有 2 个 json 列。我需要根据 j1 列更新 j2 列。如果 j2 列的元素为空,则从 j1 列中选择元素值。 j1 为 JSON 字符串,j2 为 JSON 数组。

输入数据帧,

+---------------------------+---------------------------------------+
|         j1                |              j2                       |
+---------------------------+---------------------------------------+
|{"A": "50", "B": "30"}     | [{"A": null}, {"A": "20", "B": null}] |
+---------------------------+---------------------------------------+

输出

+------------------------+---------------------------------------+
|          j1            |              j2                       |
+------------------------+---------------------------------------+
|{"A": "50", "B": "30"}  | [{"A":"50"}, {"A": "20", "B": "30"}]  |
+------------------------+---------------------------------------+

spark 版本:2.4.0 语言:scala

【问题讨论】:

  • 您能否发布示例代码以创建源数据框?
  • 列 j2 = collect_list(to_json(struct("A", "B"))) 和 j1 = to_json(struct("A", "B")

标签: json scala dataframe apache-spark


【解决方案1】:

您可以使用 regexp_replace 函数来获得所需的结果。

  val spark = SparkSession.builder().master("local[*]").getOrCreate()
  import spark.implicits._
  spark.sparkContext.setLogLevel("ERROR")

  val inDF = Seq(("""{"A": "50", "B": "30"} """, """[{"A": null}, {"A": "20", "B": null}]""")).toDF("j1", "j2")

  inDF.withColumn("A", get_json_object('j1, "$.A"))
    .withColumn("B", get_json_object('j1, "$.B"))
    .withColumn("j2", regexp_replace('j2, lit("\"A\": null"), 
      concat(lit("\"A\": "), lit("\""), 'A, lit("\""))))
    .withColumn("j2", regexp_replace('j2, lit("\"B\": null"),
      concat(lit("\"B\": "), lit("\""), 'B, lit("\""))))
    .drop("A", "B")
    .show(false)

+-----------------------+-------------------------------------+
|j1                     |j2                                   |
+-----------------------+-------------------------------------+
|{"A": "50", "B": "30"} |[{"A": "50"}, {"A": "20", "B": "30"}]|
+-----------------------+-------------------------------------+

【讨论】:

  • 我喜欢你的想法。我正在考虑解析 json 对象并从其他 json 字符串中输入值。我认为这更容易。谢谢
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多