【发布时间】:2021-06-20 23:48:16
【问题描述】:
我有一个以下格式的 Spark 数据框,其中 FamilyDetails 列是一个字符串字段:
root
|-- FirstName: string (nullable = true)
|-- LastName: string (nullable = true)
|-- FamilyDetails: string (nullable = true)
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+
|FirstName |LastName |FamilyDetails |
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+
|Emma |Smith |{ |
| | | "23214598.31601190":{"gender":"F","Name":"Ms Olivia Smith","relationship":"Daughter"}, |
| | | "23214598.23214598":{"gender":"F","Name":"Ms Emma Smith","relationship":null} |
| | |} |
|Joe |Williams |{ |
| | | "2321463.2321463":{"gender":"M","Name":"Mr Joe Williams","relationship":null}, |
| | | "2321463.3841483":{"gender":"F","Name":"Mrs Sophia Williams","relationship":"Wife","IsActive":"N"} |
| | |} |
|Liam |Jones |{ |
| | | "2321464.12379942":{"gender":"F","Name":"Miss Patricia Jones","relationship":"Sister"}, |
| | | "2321464.2321464":{"gender":"M","Name":"Mr Liam Jones","relationship":null,"IsActive":"Y"} |
| | |} |
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+
我想做的事:
我正在尝试获取我们有不活跃家庭成员的记录 (IsActive='N')。需要注意的是IsActive是可选字段。
预期输出:
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+
|FirstName |LastName |FamilyDetails |
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+ |
|Joe |Williams |{ |
| | | "2321463.2321463":{"gender":"M","Name":"Mr Joe Williams","relationship":null}, |
| | | "2321463.3841483":{"gender":"F","Name":"Mrs Sophia Williams","relationship":"Wife","IsActive":"N"} |
| | |} |
+----------+---------+--------------------------------------------------------------------------------------------------------------------------+
到目前为止我所做的尝试:
由于不知道完整的架构,我尝试从FamilyDetails 列本身创建架构。
import org.apache.spark.sql.functions._
import spark.implicits._
val json_schema = spark.read.json(myDF.select("FamilyDetails").as[String]).schema
println(json_schema)
这给了我:
StructType(
StructField(23214598.31601190,
StructType(
StructField(gender,StringType,true),
StructField(Name,StringType,true),
StructField(relationship,StringType,true),
StructField(IsActive,StringType,true)
)
,true
)
)
如何摆脱第一个值 (2321463.2321463) 并仅采用 json 架构中的必填字段?或者有没有更简单的方法来过滤IsActive = 'N' 的记录?
【问题讨论】:
标签: json scala dataframe apache-spark apache-spark-sql