在Hive中将多个列连接成一个

7

我需要将列值合并成一列。 我有一个变量colnames=col1,col2,col3,里面存储了这些列的名称。 我从Unix shell中编写以下查询,并调用Hive。但是当我这样做时,我只得到了列名连接在一起的结果,而没有得到这些列的值。

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

我希望输出结果如下:

ABCD^10^XYZ

(ABCD10XYZ是列值)


你能否提供测试数据和样本输出来解释一下? - saravanatn
我有需要在变量中连接的列,如下所示:colnames=col1,col2,col3。现在我正在Unix shell中使用上述查询作为hive -e "select concat(regexp_replace("${colnames}",",","^")) as result from table",我得到的结果是col1^col2^col3,但我想要列的值为ABCD^10^XYZ。 - akm
你正在提供与你上面解释的相同的东西。 - saravanatn
你需要提供col1的值,col2的值等等。 - saravanatn
1个回答

8
使用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,就像之前的示例一样。


@akm 确定,这不像我的例子那样。请阅读最后一个。您正在使用常量而不是列。因为SPLIT('${colnames}',',')给您常量数组,您需要在select语句中列出列列表,而不是它们的连接名称。选择将连接值。请像我示例中那样执行 - leftjoin
如果我只是提供 CONCAT_WS('^',$ {colnames}) 那么我会得到错误 - 函数的参数必须是字符串或数组<string> 但是我的数据类型是char、smallint等。 - akm
我将无法强制转换为字符串,因为这些列将动态地存储在一个变量中,我不知道会有多少列以及数据类型是什么。 - akm
我不知道变量colnames中会有多少列,它并不总是相同的。 - akm
如果您只有一个包含列名的变量,则可以使用 shell 基于第一个变量创建新变量。或者,您可以在表上构建视图,将所有列都转换为字符串,例如 select cast(col1 as string) as col1 - leftjoin
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接