Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 我们可以用Spark-UDF编写配置单元查询吗_Scala_Apache Spark_Hive_User Defined Functions - Fatal编程技术网

Scala 我们可以用Spark-UDF编写配置单元查询吗

Scala 我们可以用Spark-UDF编写配置单元查询吗,scala,apache-spark,hive,user-defined-functions,Scala,Apache Spark,Hive,User Defined Functions,我们可以用Spark-UDF编写配置单元查询吗。 我有两张桌子: 其中b1包含A的列名,b2包含A中该列的值。 现在,我希望以如下方式查询表: 基本上,根据列名及其对应的值,将A列中的值替换为B列。 为了实现这一点,我编写了spark UDF示例:转换如下 def convert(colname: String, colvalue:String)={ sqlContext.sql(“从B中选择b3,其中b1=colname,b2=colvalue”).toString; } 我注册为:

我们可以用Spark-UDF编写配置单元查询吗。 我有两张桌子:

其中b1包含A的列名,b2包含A中该列的值。 现在,我希望以如下方式查询表:

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

def convert(colname: String, colvalue:String)={
sqlContext.sql(“从B中选择b3,其中b1=colname,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

有人能建议spark/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;

这是你问题的答案。你可以在蜂箱里自己做

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不允许在内部写入查询。
您只能将数据作为变量传递,并进行转换以在行/列/表级别返回最终结果

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

不能在UDFThanks中使用sqlContext进行输入。不能在UDFThanks中使用sqlContext进行输入。