首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用hive/sql和spark读取json键值

使用hive/sql和spark读取json键值
EN

Stack Overflow用户
提问于 2015-01-13 21:11:20
回答 1查看 3.4K关注 0票数 5

我试图将这个json文件读入一个单元表中,顶层键,即1,2..,这里是不一致的。

代码语言:javascript
复制
{
    "1":"{\"time\":1421169633384,\"reading1\":130.875969,\"reading2\":227.138275}",
    "2":"{\"time\":1421169646476,\"reading1\":131.240628,\"reading2\":226.810211}",
    "position": 0
}

当列忽略位置时,我只需要蜂巢表中的时间和读数1,2。我也可以做一个蜂箱查询和星火地图-减少代码的组合。谢谢你的帮助。

更新,这是我正在尝试的

代码语言:javascript
复制
val hqlContext = new HiveContext(sc)

val rdd = sc.textFile(data_loc)

val json_rdd = hqlContext.jsonRDD(rdd)
json_rdd.registerTempTable("table123")
println(json_rdd.printSchema())
hqlContext.sql("SELECT json_val from table123 lateral view explode_map( json_map(*, 'int,string')) x as json_key, json_val ").foreach(println)

它引发以下错误:

代码语言:javascript
复制
Exception in thread "main" org.apache.spark.sql.hive.HiveQl$ParseException: Failed to parse: SELECT json_val from temp_hum_table lateral view explode_map( json_map(*, 'int,string')) x as json_key, json_val
    at org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:239)
    at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl$1.apply(ExtendedHiveQlParser.scala:50)
    at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl$1.apply(ExtendedHiveQlParser.scala:49)
    at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136)
    at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:135)
    at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
    at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
    at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:222)
EN

回答 1

Stack Overflow用户

发布于 2015-01-19 22:29:32

如果您将"1“和"2”(键名)重命名为"x1“和"x2”(在json文件中或在rdd中),这将有效:

代码语言:javascript
复制
val resultrdd = sqlContext.sql("SELECT x1.time, x1.reading1, x1.reading1, x2.time, x2.reading1, x2.reading2 from table123  ")
resultrdd.flatMap(row => (Array( (row(0),row(1),row(2)), (row(3),row(4),row(5)) )))

这将为您提供一个具有时间、reading1和reading2的元组的RDD。如果需要SchemaRDD,可以将其映射到flatMap转换中的case类,如下所示:

代码语言:javascript
复制
case class Record(time: Long, reading1: Double, reading2: Double)
resultrdd.flatMap(row => (Array( Record(row.getLong(0),row.getDouble(1),row.getDouble(2)), 
        Record(row.getLong(3),row.getDouble(4),row.getDouble(5))  )))
val schrdd = sqlContext.createSchemaRDD(resultrdd)

更新:

在许多嵌套键的情况下,可以像下面这样解析行:

代码语言:javascript
复制
val allrdd = sqlContext.sql("SELECT * from table123")
allrdd.flatMap(row=>{
    var recs = Array[Record](); 
    for(col <- (0 to row.length-1)) { 
        row(col) match { 
            case r:Row => recs = recs :+ Record(r.getLong(2),r.getDouble(0),r.getDouble(1)); 
            case _ => ; 
        } 
    }; 
    recs 
})
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27931579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档