使用sqlContext将JSON结构转换为Map [String,String]

yog*_*oga 5 apache-spark apache-spark-sql

我正在尝试在Spark Streaming作业中读取JSON数据。默认情况下sqlContext.read.json(rdd),将所有映射类型转换为结构类型。

|-- legal_name: struct (nullable = true)
 |    |-- first_name: string (nullable = true)
 |    |-- last_name: string (nullable = true)
 |    |-- middle_name: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

但是当我使用sqlContext从蜂巢表中读取时

val a = sqlContext.sql(“ select * from student_record”)

下面是架构。

|-- leagalname: map (nullable = true)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以读取read.json(rdd)和使用Map数据类型?

有没有类似的选择 spark.sql.schema.convertStructToMap

任何帮助表示赞赏。

小智 3

调用时,您需要显式定义您的架构read.json

您可以阅读Spark SQL 文档中以编程方式指定架构的详细信息。

例如,在您的具体情况下,它将是

import org.apache.spark.sql.types._
val schema = StructType(List(StructField("legal_name",MapType(StringType,StringType,true))))
Run Code Online (Sandbox Code Playgroud)

那将是一列legal_name是一张地图。

定义架构后,您可以调用 sqlContext.read.json(rdd, schema)以使用所需架构从 JSON 数据集创建数据框。