我有个有趣的问题。
我创建了一个配置单元表,如下所示:
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}
是否有任何条款调整此代码以获得所需的输出?
如果记录中缺少字段,是否可以指定空值?
2条答案
按热度按时间siotufzp1#
您需要了解,当您创建指向分隔文件的配置单元表时,它会将文件中由分隔符分隔的值的位置视为列的值。简而言之,您在配置单元表中声明了“位置参数”,以引用文件中的数据。所以当你有如下记录
这与您的模式相关联,如下所示
当你开枪的时候
select *
语句,则会显示列的结果,显然,如上所示。根据您的模式定义,这个记录相当于一个坏记录,这就是为什么要添加一个额外的
|
解决你的问题。希望这能解释这个过程。
谢谢!
g52tjvyc2#
我认为您需要在数据中显式地添加缺少的列
在那种情况下你更可能
{"sex":null,"age":null}
配置单元试图读取4个字段,但只看到3列,因此第4列为空,最后的数据将强制进入第三个字段