我有一个有趣的问题。
我创建了一个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}
是否有任何规定来调整此代码以获得所需的输出?
如果记录中缺少字段,我们可以分配空值吗?
答案 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 *
可以解决您的问题。
希望能解释这个过程。
谢谢!