web-dev-qa-db-fra.com

Concaténer plusieurs colonnes en une seule dans la ruche

J'ai besoin de concaténer des valeurs de colonne en une seule colonne. J'ai des noms de colonne dans une variable comme colnames=col1,col2,col3. J'écris la requête ci-dessous à partir d'un shell Unix et j'appelle la ruche. Mais lorsque je fais cela, je reçois uniquement les noms de colonnes concaténés et non les valeurs de ces colonnes.

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

Je voudrais que la sortie soit:

ABCD ^ 10 ^ XYZ

(ABCD, 10, XYZ sont les valeurs des colonnes)

5
akm

Vous avez besoin concat_ws fonction pour concaténer des valeurs avec ^ comme délimiteur.

Exemple avec constantes:

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

La commande avec les noms de colonne après la substitution de variable Shell devrait ressembler à ceci:

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

Dans le Shell, cela ressemblera à ceci:

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

Si les colonnes ne sont pas des chaînes, encapsulez-les avec cast en tant que chaîne à l'aide de Shell, cela permettra à concat_ws de travailler avec des chaînes et des colonnes non-chaîne.

Exemple

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

Production:

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

Utilisez une nouvelle variable pour passer à Hive comme dans l'exemple précédent.

5
leftjoin