gpt4 book ai didi

arrays - 如何在 Apache Spark 中分解 get_json_object

转载 作者:行者123 更新时间:2023-12-02 06:24:03 25 4
gpt4 key购买 nike

我的数据框的列之一中有以下字符串:

row1:[{"key":"foo"},{"key":"bar"},{"key":"baz"}]
row2:[{"key":"foo"},{"key":"bar"}]
row3:null
etc

我发现Spark有“get_json_object”函数。因此,如果我想使用 xpath 提取数据,我会使用:

 get_json_object($"json", s"$[0].key")

将返回:

"foo"
"foo"
null

但是我需要Spark的相当于“explode ”的功能。

我发现我可以在 xpath 上使用“*”符号。

 get_json_object($"json", s"$[*].key")

这不会按预期执行,它会创建一个如下字符串:

[foo,bar,baz]
[foo,baz]

我在另一个 stackoverflow 线程中找到了解决方案,

val jsonElements = (0 until 3).map(i => get_json_object($"json", s"$$[$i].key"))


val jsonElements = .map(i => get_json_object($"json", s"$$[$i].key"))
df.select($"id",explode(array(jsonElements: _*).alias("foo")))

这部分解决了我的问题,因为这个解决方案假设我知道我的数组的最大深度是多少。 Spark 的函数“from_json”需要模式,我有巨大的复杂 JSON 类型,需要“无限”的时间来创建模式。

免责声明

我不会使用任何正则表达式/子字符串/等来解析 JSON。使用解析器的整个建议就是这样。

最佳答案

只要坚持 Scala 基础知识就可以简单地解决它。尝试带有选项的案例类来解决问题。

您可以使用任何标准 json 解析器。我使用 liftweb。

import net.liftweb.json.{DefaultFormats, parseOpt}

case class jsonElement(key: String, value: Optional[String])
//assuming the value key always exists and value may or may not exist,
//so making that as optional / ignore the fields if you don't really care at all

val jsonKeys = inputRdd.map(eachRow =>
implicit val formats = DefaultFormats // hate this but deal with scala

val parsedObject = parseOpt(eachRow).flatMap(_.extractOpt[List[jsonElement]])

parsedObject match{
case Some(parsedItem) => parsedItem.map(json => json.key)
case None => List()
})

这给出了列表(键)的 Rdd。如果要删除空列表,请使用filter(list => !list.isEmpty)。你从那里就知道了。

关于arrays - 如何在 Apache Spark 中分解 get_json_object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53073029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com