如何在scala中解析数据框中的json列

时间:2019-03-25 12:13:09

标签: json scala apache-spark apache-spark-sql

我有一个数据框,它是带有json字符串的json列。下面的例子。一共有3列-a,b,c。 c列是stringType

| a         | b    |           c                       |
--------------------------------------------------------
|77         |ABC   |    {"12549":38,"333513":39}       |
|78         |ABC   |    {"12540":38,"333513":39}       |

我想将它们放入数据框(枢轴)的列中。下面的示例-

| a         | b    | 12549  | 333513 | 12540
---------------------------------------------
|77         |ABC   |38      |39      | null
|77         |ABC   | null   |39      | 38

1 个答案:

答案 0 :(得分:2)

这可能不是最有效的,因为它必须读取所有json记录才能推断出模式。如果可以静态定义架构,它应该做得更好。

val data = spark.createDataset(Seq(
  (77, "ABC", "{\"12549\":38,\"333513\":39}"),
  (78, "ABC", "{\"12540\":38,\"333513\":39}")
)).toDF("a", "b", "c")

val schema = spark.read.json(data.select("c").as[String]).schema

data.select($"a", $"b", from_json($"c", schema).as("s")).select("a", "b", "s.*").show(false)

结果:

+---+---+-----+-----+------+
|a  |b  |12540|12549|333513|
+---+---+-----+-----+------+
|77 |ABC|null |38   |39    |
|78 |ABC|38   |null |39    |
+---+---+-----+-----+------+