我有一个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/

10-11 05:00