sparksql/hive上的数组列比较

lskq00tm  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(624)

我有以下疑问: SELECT * FROM t1, t2 WHERE t1.a = 10 AND t2.a > 20 AND t1.b=t2.b 应用程序发展到 t1.a , t2.a , t1.b 以及 t2.b 数组。
我可以重写 t1.a = 10array_contains(t1.a, 10) ,但我找不到任何有效的支持sql功能,这些功能使我能够重现逻辑比较 t2.a > 20 和列内表比较 t1.b=t2.b 对数组的影响。
有人能帮我重写这个查询吗?它可能需要用户定义的函数吗?
上下文:我使用sparksql查询parquet表。我在sparksql实现许多功能时加入了hive标记。

6jjcrrmo

6jjcrrmo1#

你可以自己写 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|
+---+----------+-----+

相关问题