我用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做到这一点吗?
答案 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;