我是火花和蜂巢的新手。我不明白这句话
" Hive认为所有列都可以为空,而Parquet中的可空性很重要"
如果有人用例子解释声明,那对我来说会更好。谢谢你。
答案 0 :(得分:5)
在标准SQL语法中,当您创建表时,您可以声明特定列是"可以为空的" (即可能包含Null值)或(即尝试插入/更新Null值将引发错误)。
Nullable是默认值。< / p>
Parquet架构语法支持相同的概念,但在使用AVRO序列化时,默认值为not-nullable。
警告 - 当您使用Spark读取多个Parquet文件时,这些文件可能具有不同的模式。想象一下,模式定义随着时间的推移而发生了变化,而较新的文件最后还有2个Nullable列。然后你必须要求&#34;架构合并&#34;所以Spark从所有文件(不只是一个随机)读取模式,以确保所有这些模式兼容,然后在读取时&#34; undefined&#34;对于旧文件,列默认为Null。
Hive HQL语法不支持标准SQL功能;每列都是,并且必须是可空的 - 只是因为Hive对其数据文件没有完全控制权! 想象一下Hive分区表有2个分区...
对于基于Parquet的分区,Hive执行&#34;模式合并&#34;,而不是将文件模式合并在一起(如Spark),它将每个文件模式与表模式合并 - 忽略列未在表中定义,并默认为Null所有不在文件中的表列。
请注意,对于基于CSV的分区,它更加残酷,因为CSV文件没有&#34;架构&#34; - 它们只是按顺序有一个映射到表列的值列表。在达到EOL时,所有缺失的列都设置为Null;在达到最后一列的值时,该行上的任何额外值都将被忽略。