我们可以在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;