我们可以在 Spark 中编写配置单元查询吗?UDF
Posted
技术标签:
【中文标题】我们可以在 Spark 中编写配置单元查询吗?UDF【英文标题】:Can we write a hive query in 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 感谢您的意见。 【参考方案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;
【讨论】:
以上是关于我们可以在 Spark 中编写配置单元查询吗?UDF的主要内容,如果未能解决你的问题,请参考以下文章
来自 Apache Spark 的外部配置单元中存在的查询表 [重复]
保存从配置单元表中的 oracle 查询创建的 Spark DataFrame?
Spark2 中的 SQLContext 没有获取更新的配置单元表记录