如何在配置单元表中映射列名并将其替换为配置单元表中的新值

时间:2019-07-16 05:38:27

标签: mysql hadoop hive hiveql

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

有人可以帮助我如何将这些值插入配置单元

2 个答案:

答案 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

为了正确地将它们插入表中。

Apache Wiki

  

必须为表中的每一列提供值。尚不支持允许用户仅将值插入某些列的标准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读取的表!