在 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) 那么我会收到错误 - 函数的参数必须是字符串或数组 但我是数据类型为 char、smallint 等, 我将无法转换为字符串,因为我将在变量中动态获取这些列,并且我不知道会有多少列以及数据类型是什么

以上是关于在 hive 中将多列连接为一列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中将多列处理为一列?

在 Postgres 中将多列合并为一列

Spark:将多列分解为一列

mysql中将一列以逗号分隔的值分割成多列显示?

MySQL使用左连接将多列匹配为一[重复]

【Excel】多列数据合并为一列