我们可以在 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 没有获取更新的配置单元表记录

如何在 spark sql 的配置单元上下文对象中查找已登录/已连接/当前用户?

我们可以编写 Scala/Spark 通用动态编写的代码吗