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

Hadoop 如何处理配置单元表中缺少的字段?,hadoop,hive,Hadoop,Hive,我有一个有趣的问题 我创建了一个配置单元表,如下所示: CREATE TABLE LEARN001( Name STRING, Location ARRAY<STRING>, PesonalDetails STRUCT<sex:STRING,age:INT>, FatherSonDetails MAP<STRING,INT> ) ROW FORMAT DELIMITED FIELDS TERMINAT

我有一个有趣的问题

我创建了一个配置单元表,如下所示:

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"]    {"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}
是否有任何条款调整此代码以获得所需的输出?

如果记录中缺少字段,我们可以指定空值吗?

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

Canada||Sam:2
在这种情况下,您更可能得到
{“sex”:null,“age”:null}


配置单元试图读取4个字段,但只看到3列,因此第4列为空,最后的数据将强制进入第三个字段,但是它可以

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

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
这与您的模式相关联,如下所示

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
名称字符串-cathy
位置阵列-加利福尼亚州、圣弗朗西斯科、加拿大
PesonalDetails结构-Sam:2
FatherSonDetails地图-无
当您触发一个
select*
语句时,列的结果就会显示出来,很明显,如上所示

根据您的模式定义,这个记录相当于一个坏记录,这就是为什么添加一个额外的
可以解决您的问题

希望这能解释这个过程


谢谢

{null,null}
不是一个有效的映射或结构,但我只是想知道它在编程上是否可行。感谢您的解释:)。是否以编程方式?当然使用Spark解析数据,然后对列进行验证检查。在配置单元中插入有效的结构