【问题标题】:Can we write a hive query in Spark - UDF我们可以在 Spark 中编写配置单元查询吗?UDF
【发布时间】:2017-11-09 14:47:21
【问题描述】:

我们可以在 Spark - UDF 中编写一个配置单元查询吗? 例如,我有 2 张桌子: Table A and B

其中 b1 包含 A 的列名,b2 包含 A 中该列的值。 现在我想以这样的方式查询表,得到如下结果: Result.

基本上根据列名及其对应值将A中列的值替换为B。 为了实现这一点,我编写了 spark-UDF eg:convert 如下

def convert(colname: String, colvalue:String)={

sqlContext.sql("SELECT b3 from B where b1 = colname and b2 = colvalue").toString; } 我注册为:

sqlContext.udf.register("conv",convert(_:String,_:String));

现在我的主要查询是 -

val result = sqlContext.sql("select a1 , conv('a2',a2), conv('a3',a3)");

结果.take(2);

它给了我 java.lang.NullPointerException。

有人可以建议 spark/hive 是否支持此功能。 也欢迎任何其他方法。 谢谢!

【问题讨论】:

  • 你不能在 UDF 中使用 sqlContext
  • 感谢您的意见。

标签: scala apache-spark hive user-defined-functions


【解决方案1】:

不,UDF 不允许在里面写查询。 您只能将数据作为变量传递并进行转换以在行/列/表级别返回最终结果。

【讨论】:

    【解决方案2】:

    这是您问题的解决方案。您可以在 Hive 本身中执行此操作。

    WITH a_plus_col
    AS (SELECT a1
            ,'a2' AS col_name
            ,a2 AS col_value
        FROM A
        UNION ALL
        SELECT a1
            ,'a3' AS col_name
            ,a3 AS col_value
        FROM A)
    SELECT a_plus_col.a1 AS r1
        ,MAX(CASE WHEN a_plus_col.col_name = 'a2' THEN B.b3 END) AS r2
        ,MAX(CASE WHEN a_plus_col.col_name = 'a3' THEN B.b3 END) AS r3
    FROM a_plus_col
    INNER JOIN B ON ( a_plus_col.col_name = b1 AND a_plus_col.col_value = b2)
    GROUP BY a_plus_col.a1;
    

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 2011-06-17
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2019-08-01
      • 2021-06-06
      • 2020-09-18
      相关资源
      最近更新 更多