我有以下数据结构:
> id:int
>记录:Seq [String]
>其他:布尔值
在json文件中,为了便于测试:
var data = sc.makeRDD(Seq[String]( "{\"id\":1,\"records\": [\"one\",\"two\",\"three\"],\"other\": true}","{\"id\": 2,\"records\": [\"two\"],"{\"id\": 3,\"records\": [\"one\"],\"other\": false }")) sqlContext.jsonRDD(data).registerTempTable("temp")
而且我想过滤到记录字段中只有一个记录,而其他记录只使用sql.
我可以通过过滤器(见下文)来做到这一点,但它可以只使用sql来完成吗?
sqlContext .sql("select id,records from temp where other = true") .rdd.filter(t => t.getAs[Seq[String]]("records").contains("one")) .collect()
解决方法
Spark sql支持绝大多数Hive功能,因此您可以使用array_contains来完成这项工作:
spark.sql("select id,records from temp where other = true and array_contains(records,'one')").show # +---+-----------------+ # | id| records| # +---+-----------------+ # | 1|[one,two,three]| # +---+-----------------+
注意:在spark 1.5中,不推荐使用sqlContext.jsonRDD,请使用以下代码:
sqlContext.read.format("json").json(data).registerTempTable("temp")