将一列json字符串转换为structs



我有一列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返回。

最新更新