我有一个csv数据,如下所示,其中数据每10分钟以以下格式出现一次。我需要通过使用不同的列名映射列名来将数据插入到配置单元中。 (列的排列顺序不是恒定不变的,我们共有10列,有时我们会错过许多列,例如下面的一个示例) 样本csv文件:-
1 2 6 4
u f b h
a f r m
q r b c
现在插入蜂巢时,我需要替换列名 例如
1 -> NBR
2 -> GMB
3 -> GSB
4 -> KTC
5 -> VRV
6 -> AMB
现在我需要按如下所示插入配置单元表
NBR GMB GSB KTC VRV AMB
u f NULL h NULL b
a f NULL m NULL r
有人可以帮助我如何将这些值插入配置单元
答案 0 :(得分:2)
假设您可以在源CSV中获取列标题,则需要将其从源编号映射到其列名称。
sed -i 's/1/NBR/g; s/2/GMB/g; s/3/GSB/g; s/4/KTC/g; s/5/VRV/g; s/6/AMB/g;...;...;...;...' input.csv
由于您只能在配置单元表中获得未知总列的子集,因此您需要将CSV转换自
NBR,GMB,AMB,KTC
u,f,b,h
a,f,r,m
q,r,b,c
到
NBR,GMB,GSB,KTC,VRV,AMB,...,...,...,...
u,f,null,b,null,h,null,null,null,null
a,f,null,r,null,m,null,null,null,null
q,r,null,b,null,c,null,null,null,null
为了正确地将它们插入表中。
必须为表中的每一列提供值。尚不支持允许用户仅将值插入某些列的标准SQL语法。为了模仿标准SQL,可以为用户不希望为其分配值的列提供空值。
Standard Syntax:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
Where values_row is:
( value [, value ...] )
where a value is either null or any valid SQL literal
即使设置了LOAD DATA INPATH
,使用tblproperties("skip.header.line.count"="1")
仍需要表中所有列的有效SQL文字。这就是为什么您缺少列的原因。
如果无法让CSV的生产者创建具有1,2,... 9,10列的文件,这些文件与您的表列以及数据中的连续逗号或null
字符顺序,编写某种脚本以按照需要的顺序添加缺少的列名称,并在数据中添加所需的null
值。
答案 1 :(得分:0)
如果您在CSV中有1,2,3,4的标头(如您在注释中所写),则可以使用以下语法:
insert into table (columns where you want to insert) select 1,2,3,4 (columns) from csv_table;
因此,如果您知道csv列的顺序,则可以轻松编写插入内容,仅命名需要填充的列,而不管目标表中的顺序如何。
在运行上述插入之前,应创建一个从csv读取的表!