【发布时间】:2018-06-20 02:24:33
【问题描述】:
假设您有一堆数据,其行如下所示:
{
'key': [
{'key1': 'value11', 'key2': 'value21'},
{'key1': 'value12', 'key2': 'value22'}
]
}
我想将其读入 Spark Dataset。一种方法如下:
case class ObjOfLists(k1: List[String], k2: List[String])
case class Data(k: ObjOfLists)
那么你可以这样做:
sparkSession.read.json(pathToData).select(
struct($"key.key1" as "k1", $"key.key2" as "k2") as "k"
)
.as[Data]
这很好用,但有点破坏数据;毕竟在数据中'key' 指向对象列表而不是列表对象。换句话说,我真正想要的是:
case class Obj(k1: String, k2: String)
case class DataOfList(k: List[Obj])
我的问题:我可以在select 中输入一些其他语法,从而允许将生成的Dataframe 转换为Dataset[DataOfList]?
我尝试使用与上述相同的select 语法,结果:
线程“主”org.apache.spark.sql.AnalysisException 中的异常:需要一个数组字段但得到了
struct<k1:array<string>,k2:array<string>>;
所以我也试过了:
sparkSession.read.json(pathToData).select(
array(struct($"key.key1" as "k1", $"key.key2" as "k2")) as "k"
)
.as[DataOfList]
这个编译运行了,但是数据看起来像这样:
DataOfList(List(Obj(org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@bb2a5516,org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@bec5e4a7)))
还有其他想法吗?
【问题讨论】:
-
当然,一种解决方法是读取数据,然后应用
map将其转换为正确的形式,但这可能会有点笨拙 - 特别是如果许多字段中只有一个导致一个问题。
标签: json apache-spark apache-spark-dataset