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