scala—从存储在列中的json对象读取元素

q1qsirdb  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(471)

我有以下Dataframe

+-------+--------------------------------
|__key__|______value____________________| 
|  1    | {"name":"John", "age": 34}    |
|  2    | {"name":"Rose", "age": 50}    |

我想检索这个Dataframe中的所有年龄值,然后将其存储在数组中。

val x = df_clean.withColumn("value", col("value.age"))
x.show(false)

但这引发了一个例外。
线程“main”org.apache.spark.sql.analysisexception中出现异常:无法从值中提取值#89:需要struct type,但得到string;
如何解决我的要求
编辑

val schema = existingSparkSession.read.json(df_clean.select("value").as[String]).schema
    val my_json = df_clean.select(from_json(col("value"), schema).alias("jsonValue"))
    my_json.printSchema()
    val df_final = my_json.withColumn("age", col("jsonValue.age"))
    df_final.show(false)

目前没有抛出异常。但我也看不到任何输出
编辑2

println("---+++++--------")
df_clean.select("value").take(1)
println("---+++++--------")

输出

---+++++--------
---+++++--------
d8tt03nd

d8tt03nd1#

如果您有很长的json并且想要创建模式,那么您可以使用 from_json 使用架构。

import org.apache.spark.sql.functions._

val df = Seq(
  (1, "{\"name\":\"John\", \"age\": 34}"),
  (2, "{\"name\":\"Rose\", \"age\": 50}")
).toDF("key", "value")

val schema = spark.read.json(df.select("value").as[String]).schema

val resultDF = df.withColumn("value", from_json($"value", schema))

resultDF.show(false)
resultDF.printSchema()

输出:

+---+----------+
|key|value     |
+---+----------+
|1  |{34, John}|
|2  |{50, Rose}|
+---+----------+

架构:

root
 |-- key: integer (nullable = false)
 |-- value: struct (nullable = true)
 |    |-- age: long (nullable = true)
 |    |-- name: string (nullable = true)

如果您直接需要访问嵌套字段,那么可以使用 get_json_object ```
df.withColumn("name", get_json_object($"value", "$.name"))
.withColumn("age", get_json_object($"value", "$.age"))
.show(false)

相关问题