如何处理HIVE表中缺少的字段?

时间:2018-02-24 11:40:48

标签: hadoop hive

我有一个有趣的问题。

我创建了一个hive表,如下所示:

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   

但是,Im期望的输出是:

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

是否有任何规定来调整此代码以获得所需的输出?
如果记录中缺少字段,我们可以分配空值吗?

2 个答案:

答案 0 :(得分:1)

我认为您需要在数据中明确添加缺少的列

Canada||Sam:2

在这种情况下,您更有可能获得{"sex":null,"age":null}

HIve正在尝试读取4个字段,但只看到3个列,因此第4个为NULL,最后的数据将强制进入第3个字段,但它可以

答案 1 :(得分:0)

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

|                  _1|                  _2|_3|
+--------------------+--------------------+-----+
|[Veterans Affairs...|11669.0|101124|
|[Office Wisc Publ...|40728|40728|

这与您的架构相关联,如下所示

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 *可以解决您的问题。

希望能解释这个过程。

谢谢!