web-dev-qa-db-ja.com

ハイブで複数の列を1つに連結する

列の値を1つの列に連結する必要があります。変数にcolnames=col1,col2,col3として列名があります。 UNIXシェルから以下のクエリを記述して、Hiveを呼び出しています。しかし、これを行うと、それらの列の値ではなく、列名のみが連結されて取得されます。

select concat('regexp_replace("${colnames}",",","^")) as result from table;

私は出力を次のようにしたいと思います:

ABCD ^ 10 ^ XYZ

ABCD10XYZは列の値です)

5
akm

値を区切り文字としてconcat_wsと連結するには、^関数が必要です。

定数の例:

Hive> select concat_ws('^','ABCD','10', 'XYZ');
OK
ABCD^10^XYZ

シェル変数置換後の列名を含むコマンドは、次のようになります。

 select concat_ws('^',col1,col2,col3) as result from table;

シェルでは次のようになります。

colnames=col1,col2,col3
Hive -e "select concat_ws('^',${colnames}) as result from table"

列が文字列でない場合は、シェルを使用してキャストを文字列としてラップします。これにより、concat_wsが文字列と文字列以外の列を処理できるようになります。

colnames=col1,col2,col3
colnames2=$(echo "cast( $colnames as string)" | sed "s/,/ as string), cast( /g")
echo "$colnames2"

出力:

cast( col1 as string), cast( col2 as string), cast( col3 as string)

前の例のように、新しい変数を使用してHiveに渡します。

5
leftjoin