我有一个文件,其中有一堆列和一个名为jsonstring
是字符串类型,其中包含 json 字符串...假设格式如下:
{
"key1": "value1",
"key2": {
"level2key1": "level2value1",
"level2key2": "level2value2"
}
}
我想解析此列,如下所示: jsonstring.key1,jsonstring.key2.level2key1 返回 value1, level2value1
我怎样才能在 scala 或 Spark sql 中做到这一点。
在 Spark 2.2 中,您可以使用该函数来自_json它会为你解析 JSON。
from_json(e: 列,模式:字符串,选项:Map[String, String]):列将包含 JSON 字符串的列解析为StructType
or ArrayType
of StructTypes
具有指定的架构。
支持通过使用展平嵌套列*
(星)这似乎是最好的解决方案。
// the input dataset (just a single JSON blob)
val jsonstrings = Seq("""{
"key1": "value1",
"key2": {
"level2key1": "level2value1",
"level2key2": "level2value2"
}
}""").toDF("jsonstring")
// define the schema of JSON messages
import org.apache.spark.sql.types._
val key2schema = new StructType()
.add($"level2key1".string)
.add($"level2key2".string)
val schema = new StructType()
.add($"key1".string)
.add("key2", key2schema)
scala> schema.printTreeString
root
|-- key1: string (nullable = true)
|-- key2: struct (nullable = true)
| |-- level2key1: string (nullable = true)
| |-- level2key2: string (nullable = true)
val messages = jsonstrings
.select(from_json($"jsonstring", schema) as "json")
.select("json.*") // <-- flattening nested fields
scala> messages.show(truncate = false)
+------+---------------------------+
|key1 |key2 |
+------+---------------------------+
|value1|[level2value1,level2value2]|
+------+---------------------------+
scala> messages.select("key1", "key2.*").show(truncate = false)
+------+------------+------------+
|key1 |level2key1 |level2key2 |
+------+------------+------------+
|value1|level2value1|level2value2|
+------+------------+------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)