hive从表模式处理的Angular 看hive与parquet的关键区别

hmae6n7t  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(416)

我是新来的。我不明白这个说法
配置单元认为所有列都可以为null,而Parquet地板中的null是重要的
如果有人用例子来解释这句话,对我来说会更好。谢谢你的帮助。

7eumitmz

7eumitmz1#

在标准的sql语法中,当您创建一个表时,您可以声明一个特定的列是“可空的”(即可能包含一个空值)或不是(即尝试插入/更新一个空值将抛出一个错误)。
默认值为nullable。
parquet模式语法支持相同的概念,不过在使用avro序列化时,默认为not nullable。
警告——当您使用spark读取多个Parquet文件时,这些文件可能有不同的模式。假设模式定义随着时间的推移而改变,并且较新的文件在末尾还有两个可为空的列。然后您必须请求“schema merging”,以便spark从所有文件中读取模式(而不是随机读取一个),以确保所有这些模式都兼容,然后在读取时,对于较旧的文件,“undefined”列默认为null。
配置单元hql语法不支持标准sql功能;每一列都是而且必须是可空的——这仅仅是因为配置单元对其数据文件没有完全控制权!
想象一个有两个分区的hive分区表。。。
一个分区使用textfile格式并包含来自不同来源的csv转储,一些显示所有预期的列,一些缺少最后2列,因为它们使用了旧的定义
第二个分区将parquet格式用于hive insert select查询创建的历史记录,但是较旧的parquet文件也缺少最后2列,因为它们是使用较旧的表定义创建的
对于基于parquet的分区,hive执行“模式合并”,但它没有将文件模式合并在一起(如spark),而是将每个文件模式与表模式合并——忽略表中未定义的列,并默认为空文件中未定义的所有表列。
请注意,对于基于csv的分区来说,这要残酷得多,因为csv文件没有“模式”--它们只有一个按顺序Map到表列的值列表。到达eol时,所有缺少的列都设置为null;达到最后一列的值时,将忽略该行上的任何额外值。

相关问题