如何处理配置单元表中缺少的字段?

oxf4rvwz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(503)

我有个有趣的问题。
我创建了一个配置单元表,如下所示:

CREATE TABLE LEARN001(
     Name STRING,
     Location ARRAY<STRING>,
     PesonalDetails STRUCT<sex:STRING,age:INT>,
     FatherSonDetails MAP<STRING,INT>
     )
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '|'
    COLLECTION ITEMS TERMINATED BY ','
    MAP KEYS TERMINATED BY ':';

我提供的输入是:

anupam|Delhi,mumbai,chennai|Male,45|Daulat:4

cathy|California,San Fransisco, Canada|Sam:2

load data inpath '//LEARN111.txt' into table LEARN001;

select * from LEARN001;

我得到的输出是:

anupam  ["Delhi","mumbai","chennai"]    {"sex":"Male","age":45} {"Daulat":4}                                                                         
cathy   ["California","San Fransisco"," Canada"] {"sex":"Sam:2","age":null}  NULL

但是,我期望的输出是:

anupam  ["Delhi","mumbai","chennai"]    {"sex":"Male","age":45} {"Daulat":4}   
cathy   ["California","San Fransisco"," Canada"] {null,null} {"Sam":2}

是否有任何条款调整此代码以获得所需的输出?
如果记录中缺少字段,是否可以指定空值?

siotufzp

siotufzp1#

您需要了解,当您创建指向分隔文件的配置单元表时,它会将文件中由分隔符分隔的值的位置视为列的值。简而言之,您在配置单元表中声明了“位置参数”,以引用文件中的数据。所以当你有如下记录

cathy|California,San Fransisco, Canada|Sam:2

这与您的模式相关联,如下所示

Name STRING - cathy
Location ARRAY<STRING> - California,San Fransisco, Canada
PesonalDetails STRUCT<sex:STRING,age:INT> - Sam:2
FatherSonDetails MAP<STRING,INT> - NOTHING

当你开枪的时候 select * 语句,则会显示列的结果,显然,如上所示。
根据您的模式定义,这个记录相当于一个坏记录,这就是为什么要添加一个额外的 | 解决你的问题。
希望这能解释这个过程。
谢谢!

g52tjvyc

g52tjvyc2#

我认为您需要在数据中显式地添加缺少的列

Canada||Sam:2

在那种情况下你更可能 {"sex":null,"age":null} 配置单元试图读取4个字段,但只看到3列,因此第4列为空,最后的数据将强制进入第三个字段

相关问题