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)
谁能帮我这个如何将这个值插入蜂巢
假设您可以在源 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数据中所需的值。