我的UDF函数以字符串形式返回一个json对象数组,如何将其扩展为数据帧行?
如果不可能,还有其他方法(例如使用Struct)来实现这一目标吗?
这是我的JSON数据:
sample json
{
"items":[ {"Name":"test", Id:"1"}, {"Name":"sample", Id:"2"}]
}
这就是我希望它最终像这样的结果:
test, 1
sample, 2
答案 0 :(得分:1)
这个想法是spark可以读取任何 paralellized 集合,因此我们采用 string 并将其并行化并作为数据集
读取代码 =>
import org.apache.spark.sql.functions._
val sampleJsonStr = """
| {
| "items":[ {"Name":"test", "Id":"1"}, {"Name":"sample", "Id":"2"}]
| }"""
val jsonDf = spark.read.option("multiLine","true").json(Seq(sampleJsonStr).toDS)
//jsonDf: org.apache.spark.sql.DataFrame = [items: array<struct<Id:string,Name:string>>]
// Finally we explode the json array
val explodedDf = jsonDf.
select("items").
withColumn("exploded_items",explode(col("items"))).
select(col("exploded_items.Id"),col("exploded_items.Name"))
输出 =>
scala> explodedDf.show(false)
+---+------+
|Id |Name |
+---+------+
|1 |test |
|2 |sample|
+---+------+