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)
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.