【问题标题】:How to parse json column in dataframe in scala [duplicate]如何在scala中解析数据框中的json列[重复]
【发布时间】:2019-08-15 16:18:43
【问题描述】:

我有一个数据框,它是带有 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

【问题讨论】:

  • json格式总是一样的吗?
  • 我认为你需要更清晰的解释。
  • @Oli json 列不固定。 Json 总是相同的格式
  • 那么这种情况下的逻辑是什么?您能否提供一个完全反映您正在尝试做的事情的例子? (可能还有更广泛的解释)
  • 更新问题。

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


【解决方案1】:

这可能不是最有效的,因为它必须读取所有 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    |
+---+---+-----+-----+------+

【讨论】:

  • 太棒了。但我也得到 _corrupt_record 列
  • 您的某些 json 数据已损坏或包含换行符。您可以尝试使用多行选项val schema = spark.read.option("multiline", true).json(data.select("c").as[String]).schema,否则您必须过滤或更正损坏的数据:source
  • 如何使标头类似于“a,b,json_12540,json_12549,json_333513”?
  • 要动态地执行此操作,我认为您必须迭代 df.columns 并有选择地使用 .withColumnRenamed() 单独重命名它们。但是,我将重申,在这种情况下,静态模式的性能会更好。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 2011-12-31
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多