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|
+---+----------+-----+