json - 在模式 rdd 中分解 json 数组

标签 json scala apache-spark-sql

我有一个像:

{"name":"Yin", "address":[{"city":"Columbus","state":"Ohio"},{"city":"Columbus","state":"Ohio"}]} 
{"name":"Michael", "address":[{"city":null, "state":"California"},{"city":null, "state":"California"}]}

这里的地址是一个数组,如果我使用 sqlContext.jsonfile我在模式 rdd 中获取数据如下:
[Yin , [(Columbus , Ohio) , (Columbus , Ohio)] 
[Micheal , [(null, California) , (null, California)] 

我想分解现有的数组,并希望架构 rdd 中的数据采用以下格式:
[Yin, Columbus, Ohio] 
[Yin, Columbus, Ohio] 
[Micheal, null, California] 
[Micheal, null, California]

我正在使用 Spark SQL

最佳答案

典型的建议是为此退出 sql,但如果您想继续使用 SQL,这里是我从邮件列表中询问这个问题得到的答案(nabble 由于某种原因没有显示响应):

来自迈克尔·阿姆布鲁斯特

您可以使用横向 View 爆炸(使用 HiveContext ),但似乎缺少的是 jsonRDD 将 json 对象转换为结构(具有固定顺序的固定键),并且使用 . 访问结构中的字段

val myJson = sqlContext.jsonRDD(sc.parallelize("""{"foo":[{"bar":1},{"baz":2}]}""" :: Nil))
myJson.registerTempTable("JsonTest")​
val result = sql("SELECT f.bar FROM JsonTest LATERAL VIEW explode(foo) a AS f").collect()

myJson: org.apache.spark.sql.DataFrame = [foo: array<struct<bar:bigint,baz:bigint>>]
result: Array[org.apache.spark.sql.Row] = Array([1], [null])

在 Spark 1.3 中,您还可以通过手动指定 JSON 的模式,向 jsonRDD 提示您希望将 json 对象转换为 Maps(非统一键)而不是结构体。
import org.apache.spark.sql.types._
val schema =
  StructType(
    StructField("foo", ArrayType(MapType(StringType, IntegerType))) :: Nil)
​
sqlContext.jsonRDD(sc.parallelize("""{"foo":[{"bar":1},{"baz":2}]}""" :: Nil), schema).registerTempTable("jsonTest")
​
val withSql = sql("SELECT a FROM jsonTest LATERAL VIEW explode(foo) a AS a WHERE a['bar'] IS NOT NULL").collect()
​
val withSpark = sql("SELECT a FROM jsonTest LATERAL VIEW explode(foo) a AS a").rdd.filter  {
  case Row(a: Map[String, Int]) if a.contains("bar") => true
  case _: Row => false
}.collect()
schema: org.apache.spark.sql.types.StructType = StructType(StructField(foo,ArrayType(MapType(StringType,IntegerType,true),true),true))
withSql: Array[org.apache.spark.sql.Row] = Array([Map(bar -> 1)])
withSpark: Array[org.apache.spark.sql.Row] = Array([Map(bar -> 1)])

关于json - 在模式 rdd 中分解 json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902234/

相关文章:

json - 无法通过可编码的swift从json中获取数据

ruby-on-rails - 给定一个 json 对象,如何在 rails 中遍历该对象

scala - 如何在编译时检查类型是否为元组

python - 在 Spark 中加入 DF 后删除重复的列

使用express JS进行JSON漏洞防护

php - 在数据库中保存 jquery json 数据

scala - 是否可以创建包含无效 UTF-8 字节的 Scala 字符串?

c# - 为什么 Scala 没有在匿名类型之间定义合理的相等性?

scala - 使用 start-all.sh 启动 Spark 时出错

java - 将 Spark DF 转换为具有不同字段名称的 DS