当前位置: 首页 > 知识库问答 >
问题:

如何解析json列在数据帧在scala[复制]

党宇定
2023-03-14

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

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

我想把它们变成数据帧(pivot)的列。下面的例子-

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

共有1个答案

太叔永新
2023-03-14

这可能不是最有效的,因为它必须额外读取所有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    |
+---+---+-----+-----+------+
 类似资料:
  • 问题内容: 我正在使用Scala 2.8中的JSON类中的构建来解析JSON代码。由于最小化依赖性,我不想使用Liftweb或其他任何一种。 我这样做的方法似乎势在必行,是否有更好的方法可以做到? 问题答案: 这是一个基于提取器的解决方案,它将进行类转换: 在for循环的开始,我人为地将结果包装在一个列表中,以便在最后生成一个列表。然后在for循环的其余部分中,我将使用生成器(使用)和值定义(使用

  • 我有一个完全相同的文件A和B。我试图在这两个数据帧上执行内部和外部连接。因为我将所有的列都作为重复的列,所以现有的答案没有任何帮助。我遇到的其他问题包含一两个重复的列,我的问题是整个文件都是彼此重复的:无论是数据还是列名。 我的代码: 我面临的错误是:

  • 在Flutter中解析我的时出现了一个问题。这是我的JSON。 我已经为这个数据生成了一个模型,它工作得很完美。 因此,在每个索引中都有另一个列表,我需要将其保存在InsurancePolicyType对象中。这就是我试图获取的数据。如何在代码中获取?我需要去拿那张名单,但我没能去。

  • 我试着把XML解析成R数据帧,这个链接帮了我大忙: 如何从xml文件创建R数据帧 但我还是没有弄清楚我的问题: 下面是我的代码: 我想要的数据帧是这样的: 我被困住了,任何帮助都将非常感谢,谢谢。

  • 我想将一列索引为“length”,并使其成为我的第二列。它目前作为第5列存在。我试过: 我看到以下错误: TypeError:必须是str,而不是list 我不确定如何解释这个错误,因为它实际上应该是一个

  • 我想将包含字符串记录的RDD转换为Spark数据帧,如下所示。 模式行不在同一个中,而是在另一个变量中: 所以现在我的问题是,我如何使用上面两个,在Spark中创建一个数据帧?我使用的是Spark 2.2版。 我确实搜索并看到了一篇帖子:我可以使用spack-csv将表示为字符串的CSV读取到Apache Spark中吗?然而,这并不是我所需要的,我也无法找到一种方法来修改这段代码以在我的情况下工