将一列json字符串转换为结构

时间:2016-07-21 15:20:25

标签: scala apache-spark apache-spark-sql

我有一列json字符串,并希望能够将它们转换为结构体,类似于SQLContext.read.json()在初始读取文件时进行转换的方式。

或者,有没有办法嵌套我的DataFrames?我也可以这样做。

3 个答案:

答案 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
  }
}

您可以在https://spark.apache.org/docs/2.2.2/api/java/org/apache/spark/sql/functions.html#from_json-org.apache.spark.sql.Column-org.apache.spark.sql.types.DataType-

阅读更多内容

答案 2 :(得分:0)

在最新版本的spark上,如果您使用JSON:

Dataset[String]

您可以这样做:

spark.read.json(theJsonStringDataset)

从DataFrameReader的文档中:

def json(jsonDataset: Dataset[String]): DataFrame

加载存储JSON对象(JSON行文本格式或换行符分隔的JSON)的数据集[String],并将结果作为DataFrame返回。