我有一个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
现在我需要插入到 hive 表如下
NBR GMB GSB KTC VRV AMB
u f NULL h NULL b
a f NULL m NULL r
谁能帮我这个如何将这个值插入到 hive 中
最佳答案
假设您可以在源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
为了正确地将它们插入到您的表中。
从Apache Wiki:
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
值。关于mysql - 如何在配置单元表中映射列名并将其替换为配置单元表中的新值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57050657/