在 hive 中将多列连接为一列
Posted
技术标签:
【中文标题】在 hive 中将多列连接为一列【英文标题】:Concatenate multiple columns into one in hive 【发布时间】:2018-07-06 13:16:11 【问题描述】:我需要将列值连接到单个列中。
我在变量中有列名 colnames=col1,col2,col3
。
我正在从 unix shell 编写以下查询并调用配置单元。但是当我这样做时,我只得到连接的列名而不是这些列的值。
select concat('regexp_replace("$colnames",",","^")) as result from table;
我希望输出为:
ABCD^10^XYZ
(ABCD
,10
,XYZ
是列值)
【问题讨论】:
能否通过提供测试数据和样本输出来解释一下 我有列要连接到一个变量中,如下面的 colnames=col1,col2,col3。现在我在 Unix shell 中使用上述查询作为 hive -e "select concat(regexp_replace("$colnames",",","^")) as result from table" 我得到的结果是 col1^col2 ^col3 但我希望该列的值为 ABCD^10^XYZ 你给出的东西和你上面解释的一样 你已经给 col1 值和 col2 值等等 【参考方案1】:使用concat_ws
函数以^
作为分隔符连接值。
常量示例:
hive> select concat_ws('^','ABCD','10', 'XYZ');
OK
ABCD^10^XYZ
shell 变量替换后带有列名的命令应如下所示:
select concat_ws('^',col1,col2,col3) as result from table;
在 shell 中它看起来像这样:
colnames=col1,col2,col3
hive -e "select concat_ws('^',$colnames) as result from table"
如果列不是字符串,则使用 shell 将它们转换为字符串,这将允许 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。
【讨论】:
上述工作如果我们手动给出列名,在我的情况下,我不知道要连接的列,我将从变量(colnames=col1,col2,col3)中获取它这就是为什么我使用 $colnames 代替列名的原因,因为它是一个外壳,它将在那里填充列名。 CONCAT_WS('^',(SPLIT('$colnames',','))) as result ,这个也只给出了连接的列名而不是价值观 @akm 当然,这与我的示例不同。请阅读最后一篇。您使用的是常量,而不是列。因为 SPLIT('$colnames',',') 为您提供了常量数组,并且您需要 select 语句中的列列表,而不是它们的连接名称。并且 select 将连接值。请像我的示例中那样做 如果我只是给出 CONCAT_WS('^',$colnames) 那么我会收到错误 - 函数的参数必须是字符串或数组以上是关于在 hive 中将多列连接为一列的主要内容,如果未能解决你的问题,请参考以下文章