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

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

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

  1. CREATE TABLE LEARN001(
  2. Name STRING,
  3. Location ARRAY<STRING>,
  4. PesonalDetails STRUCT<sex:STRING,age:INT>,
  5. FatherSonDetails MAP<STRING,INT>
  6. )
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY '|'
  9. COLLECTION ITEMS TERMINATED BY ','
  10. MAP KEYS TERMINATED BY ':';

我提供的输入是:

  1. anupam|Delhi,mumbai,chennai|Male,45|Daulat:4
  2. cathy|California,San Fransisco, Canada|Sam:2
  3. load data inpath '//LEARN111.txt' into table LEARN001;
  4. select * from LEARN001;

我得到的输出是:

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

但是,我期望的输出是:

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

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

siotufzp

siotufzp1#

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

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

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

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

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

g52tjvyc

g52tjvyc2#

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

  1. Canada||Sam:2

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

相关问题