您可以编写自己的UDF 进行比较。很简单:
sqlContext.udf.register("arrayGreater", (arr: Seq[Int], x: Int) => {
arr.toArray.filter(i => i > x).length > 0
})
然后,你可以这样使用它:
val df = Seq((1,Array(1,2,3)), (2,Array(7,9,11))).toDF("key", "arr")
df.registerTempTable("DF")
df.show
+---+----------+
|key| arr|
+---+----------+
| 1| [1, 2, 3]|
| 2|[7, 9, 11]|
+---+----------+
sqlContext.sql("SELECT * from DF where arrayGreater(arr, 10)").show
+---+----------+
|key| arr|
+---+----------+
| 2|[7, 9, 11]|
+---+----------+
请注意,截至目前,arrayGreater 正在返回 Boolean。你可以让它返回一个Int——只需返回过滤后的length,而不是检查它是否是> 0:
sqlContext.udf.register("arrayCountGreater", (arr: Seq[Int], x: Int) => {
arr.toArray.filter(i => i > x).length
})
sqlContext.sql("SELECT *, arrayCountGreater(arr, 2) from DF").show
+---+----------+-----+
|key| arr|count|
+---+----------+-----+
| 1| [1, 2, 3]| 1|
| 2|[7, 9, 11]| 3|
+---+----------+-----+