我们可以在 Spark - UDF 中编写一个 hive 查询吗?



我们可以在Spark - UDF中编写一个hive查询吗?例如,我有 2 张桌子:表 A 和 B

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

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

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)");

结果取(2);

它给了我java.lang.NullPointerException。

有人可以建议在火花/蜂巢中是否支持此功能。任何其他方法也是受欢迎的。谢谢!

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

这是您问题的解决方案。你可以在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;

最新更新