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

Database 在配置单元中加载具有不同长度行的CSV文件,database,database-design,hadoop,hive,hiveql,Database,Database Design,Hadoop,Hive,Hiveql,如何在配置单元中加载CSV文件,并且每行具有不同的列数? 问题是每行都有未定义的字段数,否则我会创建一个表,其中包含CSV可以拥有的最大字段数 字段1到5将始终存在。然而,字段6到无穷远可能并不总是存在。 一个可以接受的解决方案是在配置单元中导入文件时将字段6连接到无穷大 这可能吗 以下是我的CSV文件示例,以明确说明: data11;data12;data13;data14 data21;data22;data23;data24;data25 data31;data32;data33;data

如何在配置单元中加载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

我可以想到三个选择:

如果可能字段的数量不是无限的,而是大于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;

谢谢你的回答,这对我很有帮助

我选择了第三个选项,对此我做了一些修改,因为字段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; 将视图b创建为 选择 正则表达式提取(行“([^\;]*)\”([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)”,1)作为col1, 正则表达式提取(行“([^\;]*)\”([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)”,2)作为col2, 正则表达式提取(行“([^\;]*)\”([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)”,3)作为col3, regexp_提取(行“([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)”,4)作为col4, 正则表达式提取(行“([^\;]*)\”([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)”,5)作为col5, regexp\u替换(regexp\u提取(行“([^\;]*)\”([^\;]*)\([^\;]*))\;([^\;]*)\([^\;]*)\;([^\;]*)\(.*),6),“\;”,“\;”)作为rest 从一个;