2017-11-09 7 views
0

Spark-UDFでハイブクエリを書くことはできますか? 例えば、私は2つのテーブルれている: Table A and BSpark-UDFでハイブクエリを書くことができます

b1はAの列名が含まれており、b2はA. にその列の値が含まれている今、私は以下のように結果を得るような方法でテーブルを照会します: Result

基本的に、列名とそれに対応する値に基づいて、Aの列の値をBに置き換えます。今、私のメインのクエリは

val result = sqlContext.sql("select a1 , conv('a2',a2), conv('a3',a3)"); 

結果をIS-

sqlContext.udf.register("conv",convert(_:String,_:String)); 

:私のようにそれを登録し

def convert(colname: String, colvalue:String)={ 

以下

sqlContext.sql("SELECT b3 from B where b1 = colname and b2 = colvalue").toString; } として変換します。私は火花UDFなどを書いたことを実現するために 。 take(2);

それは私にjava.lang.NullPointerExceptionを与えます。

この機能がスパーク/ハイブでサポートされている場合は、誰かがお勧めしますか? 他の方法も歓迎します。 ありがとう!

+0

UDFの内部でsqlContextを使用することはできません –

+0

ありがとうございます。 – MGM

答えて

1

いいえ、UDFでは、クエリを内部で書き込むことはできません。 データを変数として渡すことができ、変換を行って最終結果を行/列/テーブルレベルに戻すことができます。

1

ここにあなたの質問に対する解決策があります。あなたは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; 
関連する問題