如何从数组中删除双引号

时间:2019-08-09 16:30:24

标签: hive hql hiveql

我用ORC格式创建了一个配置单元表,并将数据加载到该表中。我已经使用collect_set消除重复项,如下所示以插入数据。但是,我在数组中看到双引号。无论如何,有没有删除那些双引号?

这是一个示例数据,它是从表a获取并使用以下命令插入到表b中的:

insert into table b 
select a.name as name, collect_set(b.sub) as subjects from a group by a.name;

我的桌子会像这样:

name   |     subjects
john   |   ["Eng", "Math", "Phy"]
Sarah  |   ["Math", "Chem"]

我想让数组中的双引号看起来像这样:

name   |     subjects
john   |   [Eng, Math, Phy]
Sarah  |   [Math, Chem]

反正有使用hql做到这一点吗?

1 个答案:

答案 0 :(得分:0)

数组是一个对象,要显示,需要将其转换为字符串。

当您选择数组时,它将被转换(序列化)为字符串。 Hive将数组显示为用逗号分隔的值,并在方括号中用双引号引起来。

考虑以下示例:

select array('Eng', 'Math', 'Phy');

返回:

["Eng","Math","Phy"]

我想说的是,初始数据中很可能没有双引号",当您直接选择它而不显式转换为字符串时,它会被序列化为带双引号的String。

如果这是选择结果中双引号的真正原因,那么解决方案是将数组显式转换为字符串:

select concat('[',concat_ws(',',array('Eng', 'Math', 'Phy')),']');

返回:

[Eng,Math,Phy]

这是您期望的吗?

如果没有,并且您确实需要从列值中删除双引号,那么regexp_replace就可以了。

在值中包含双引号的数组示例:

select concat('[',concat_ws(',',array('"Eng"', '"Math"', '"Phy"')),']');

返回:

["Eng","Math","Phy"] 

在这种情况下,您可以在加载表格时应用regexp_replace

regexp_replace(string, '["]', '')-这将删除双引号

您的插入语句将如下所示:

insert into table b select a.name as name, collect_set(regexp_replace(sub, '["]', '')) as subjects from a group by a.name;