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

Rah*_*rma 8 mysql hadoop hive hiveql

我有一个csv数据,如下所示,其中数据每10分钟以以下格式出现一次。我需要通过使用不同的列名映射列名来将数据插入到配置单元中。(列的顺序不是恒定不变的,它们改变顺序,我们总共有10列,有时我们会错过许多列,例如下面的一个示例):csv文件示例:

1  2  6  4
u  f  b  h
a  f  r  m
q  r  b  c
Run Code Online (Sandbox Code Playgroud)

现在,当插入到蜂巢中时,我需要替换例如列名

1 -> NBR
2 -> GMB
3 -> GSB
4 -> KTC
5 -> VRV
6 -> AMB
Run Code Online (Sandbox Code Playgroud)

现在我需要插入到蜂巢表如下

NBR GMB   GSB   KTC   VRV   AMB
 u   f    NULL  h     NULL   b     
 a   f    NULL  m     NULL   r     
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个如何将这个值插入蜂巢

Chr*_*tta 3

假设您可以在源 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

由于您只能获得 Hive 表中总列的未知子集,因此您需要将 CSV 转换为

NBR,GMB,AMB,KTC
u,f,b,h
a,f,r,m
q,r,b,c
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

以便将它们正确插入到您的表中。

来自 阿帕奇维基

必须为表中的每一列提供值。尚不支持允许用户仅将值插入某些列的标准 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
Run Code Online (Sandbox Code Playgroud)

使用LOAD DATA INPATH,即使使用该tblproperties("skip.header.line.count"="1")集合,仍然需要表中所有列的有效 SQL 文字。这就是为什么你缺少列的原因。

如果您无法让 CSV 的生成者按照表列的顺序创建包含 1,2,...9,10 列的文件以及null数据中的连续逗号或字符,请编写某种脚本来添加缺少列名称(按照您需要的顺序排列)以及null数据中所需的值。