我有一列json字符串,并希望能够将它们转换为结构体,类似于SQLContext.read.json()在初始读取文件时进行转换的方式。
或者,有没有办法嵌套我的DataFrames?我也可以这样做。
答案 0 :(得分:2)
Spark不支持数据框(或数据集或RDD)嵌套。
您可以将问题分解为两个单独的步骤。
首先,您需要解析JSON并构建一个完全由Spark支持的类型组成的案例类。这个问题与Spark无关,所以让我们假设您将其编码为:
def buildMyCaseClass(json: String): MyCaseClass = { ... }
然后,您需要转换数据帧,使字符串列成为结构列。最简单的方法是通过UDF。
val builderUdf = udf(buildMyCaseClass _)
df.withColumn("myCol", builderUdf('myCol))
答案 1 :(得分:0)
Spark SQL提供了类似于to_json()的功能来将结构编码为字符串,并提供from_json()的功能来将结构检索为复杂类型。
{
"a": "{\"b\":1}"
}
val schema = new StructType().add("b", IntegerType)
events.select(from_json('a, schema) as 'c)
// output
{
"c": {
"b": 1
}
}
阅读更多内容
答案 2 :(得分:0)
在最新版本的spark上,如果您使用JSON:
Dataset[String]
您可以这样做:
spark.read.json(theJsonStringDataset)
从DataFrameReader的文档中:
def json(jsonDataset: Dataset[String]): DataFrame
加载存储JSON对象(JSON行文本格式或换行符分隔的JSON)的数据集[String],并将结果作为DataFrame返回。