在配置单元中加载具有不同长度行的csv文件

c0vxltue  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(358)

如何在配置单元中加载csv文件,使每一行具有不同的列数?问题是,每一行都有一个未定义的字段数,否则我会创建一个表,其中包含csv可以拥有的最大字段数。。。
字段1到5将始终存在。然而,场6到无穷远可能并不总是存在。一个可以接受的解决方案是在配置单元中导入文件时将字段6连接到无穷大。
这有可能吗?
下面是我的csv文件的一个示例:

data11;data12;data13;data14
data21;data22;data23;data24;data25
data31;data32;data33;data34;data35;data36
data41;data42;data43
u3r8eeie

u3r8eeie1#

谢谢你的回答,这对我很有帮助。
我选择了第三个我修改了一点的选项,因为看起来字段6到无穷大(当然不是真正的无穷大)没有正确地插入到最后一列中。实际上,视图“b”中只插入了字段6。
我在同一个字符串中将字段6连接到无穷大,但用管道字符“|”分隔。以下是修改后的代码:

create view b as
select
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 1) as col1,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 2) as col2,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 3) as col3,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 4) as col4,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 5) as col5,
regexp_replace(regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;(.*)', 6), '\;', '|') as rest
from a;
fnatzsnv

fnatzsnv2#

我可以想到三个选择:
如果可能字段的数量不是无限的,而是大于5,那么您可以简单地定义所有这些字段,而数据中不存在的字段将是空的。
你可以写一个自定义的serde。
或者您可以将分隔符设置为数据中不存在的内容,然后使用regex自己提取字段。例子:

create table a(line string) row format delimited fields terminated by '\A';

create view b as
select
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 1) as col1,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 2) as col2,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 3) as col3,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 4) as col4,
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 5) as col5,
split(regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 6), '\;') as rest
from a;

相关问题