scala – Seq.contains in Spark Dataframe中的SQL

我有以下数据结构:

> 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")

相关文章

Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法。可以在你不知道具体类型的...
文章目录Option和SomeOption和NoneOption和模式匹配 在java 8中,为了避免NullPointerException,引入了...
文章目录泛类型型变协变逆变不变类型上界类型下界内部类抽象类型复合类型自类型隐式参数隐式转换多态方...
Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini...
文章目录面向对象的scalaUnified TypesClassesTraits 面向对象的scala 我们知道Scala是一种JVM语言,可...
文章目录默认参数值命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以...