SparkSQL/Hive上的数组列比较

SparkSQL/Hive上的数组列比较,hive,apache-spark-sql,Hive,Apache Spark Sql,我有以下疑问: 从t1、t2中选择*其中t1.a=10和t2.a>20以及t1.b=t2.b 该应用程序发展为具有t1.a、t2.a、t1.b和t2.b阵列 我可以将t1.a=10重写为array\u contains(t1.a,10),但我找不到任何有效的支持SQL功能,使我能够重现逻辑比较t2.a>20和列表内比较t1.b=t2.b对数组的影响 有人能帮我重写这个查询吗?它是否可能需要用户定义的函数 上下文:我正在使用Spark SQL查询拼花地板表。我包括了配置单元标记,因为Spark S

我有以下疑问:

从t1、t2中选择*其中t1.a=10和t2.a>20以及t1.b=t2.b

该应用程序发展为具有
t1.a
t2.a
t1.b
t2.b
阵列

我可以将
t1.a=10
重写为
array\u contains(t1.a,10)
,但我找不到任何有效的支持SQL功能,使我能够重现逻辑比较
t2.a>20
和列表内比较
t1.b=t2.b
对数组的影响

有人能帮我重写这个查询吗?它是否可能需要用户定义的函数


上下文:我正在使用Spark SQL查询拼花地板表。我包括了配置单元标记,因为Spark SQL实现了它的许多功能。

您可以编写自己的
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]|
+---+----------+
请注意,从现在开始,
arrayCreate
正在返回一个
布尔值。您可以让它返回一个
Int
——只需返回过滤后的
长度
,而不是检查它是否为
>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|
+---+----------+-----+

您可以编写自己的
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]|
+---+----------+
请注意,从现在开始,
arrayCreate
正在返回一个
布尔值。您可以让它返回一个
Int
——只需返回过滤后的
长度
,而不是检查它是否为
>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|
+---+----------+-----+