我有一列json字符串,希望能够将它们转换为structs,类似于SQLContext.read.json()在首次读取文件时进行转换的方式。
或者,有没有办法嵌套我的DataFrames?我也可以这么做。
Spark不支持数据帧(或数据集或RDD)嵌套。
你可以把你的问题分解成两个单独的步骤。
首先,您需要解析JSON并构建一个完全由Spark支持的类型组成的case类。这个问题与Spark无关,所以我们假设您已经将其编码为:
def buildMyCaseClass(json: String): MyCaseClass = { ... }
然后,您需要转换数据帧,使字符串列成为结构列。最简单的方法是通过UDF。
val builderUdf = udf(buildMyCaseClass _)
df.withColumn("myCol", builderUdf('myCol))
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
}
}
你可以在https://spark.apache.org/docs/2.2.2/api/java/org/apache/spark/sql/functions.html#from_json-org.apache.spark.sql.Column-rg.apache.spark.sql.types.DataType-
在最新版本的spark上,如果您的JSON位于:
Dataset[String]
你可以做:
spark.read.json(theJsonStringDataset)
来自DataFrameReader的文档:
def json(jsonDataset: Dataset[String]): DataFrame
加载存储JSON对象的数据集[String](JSON Lines文本格式或换行符分隔的JSON),并将结果作为DataFrame返回。