【问题标题】:Array columns comparison on SparkSQL / HiveSpark SQL / Hive 中的数组列比较
【发布时间】:2023-03-22 06:20:01
【问题描述】:

我有以下疑问:

SELECT * FROM t1, t2 WHERE t1.a = 10 AND t2.a > 20 AND t1.b=t2.b

应用程序演变为具有 t1.at2.at1.bt2.b 数组。

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

谁能帮我重写查询?它可能需要用户定义的函数吗?

上下文:我正在使用 Spark SQL 来查询 Parquet 表。我包含 Hive 标签,因为 Spark SQL 实现了它的许多功能。

【问题讨论】:

    标签: hive apache-spark-sql


    【解决方案1】:

    您可以编写自己的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|
    +---+----------+-----+
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多