我们可以在 Spark 中编写配置单元查询吗 - UDF
Can we write a hive query in Spark - UDF
我们可以在 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)");
result.take(2);
它给了我 java.lang.NullPointerException.
有人可以建议 spark/hive 是否支持此功能。
也欢迎任何其他方法。
谢谢!
这是您问题的解决方案。您可以在 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;
不,UDF 不允许在其中编写查询。
您只能将数据作为变量传递并进行转换以将最终结果返回 row/column/table 级别。
我们可以在 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)");
result.take(2);
它给了我 java.lang.NullPointerException.
有人可以建议 spark/hive 是否支持此功能。 也欢迎任何其他方法。 谢谢!
这是您问题的解决方案。您可以在 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;
不,UDF 不允许在其中编写查询。 您只能将数据作为变量传递并进行转换以将最终结果返回 row/column/table 级别。