从表模式处理的角度来看,Hive和Parquet之间的SPARK-HIVE关键差异

Rak*_*kib 1 hive apache-spark

我是火花和蜂巢的新手.我不明白这个说法

"Hive认为所有列都可以为空,而P​​arquet中的可空性很重要"

如果有人用例子解释这个陈述,那对我来说会更好.谢谢你.

Sam*_*ter 5

标准的SQL语法,当你创建一个表,你可以说一个具体的列是"可空" (即可能包含Null值)或没有(即试图插入/更新空值都将抛出一个错误).
Nullable是默认值.

Parquet模式语法支持相同的概念,但在使用AVRO序列化时,默认值为not-nullable.
警告 - 当您使用Spark读取多个Parquet文件时,这些文件可能具有不同的模式.想象一下,模式定义随着时间的推移而发生了变化,而较新的文件最后还有2个Nullable列.然后你必须请求"模式合并",以便Spark从所有文件(不只是随机的一个)读取模式,以确保所有这些模式兼容,然后在读取时"未定义"列默认为Null旧文件.

Hive HQL语法不支持标准SQL功能; 每列都是,并且必须是可空的 - 只是因为Hive对其数据文件没有完全控制权!
想象一下带有2个分区的Hive分区表...

  • 一个分区使用TextFile格式并包含来自不同源的CSV转储,一些显示所有预期列,一些缺少最后两列,因为它们使用较旧的定义
  • 第二个分区使用Parquet格式作为历史记录,由Hive INSERT-SELECT查询创建,但旧的Parquet文件也缺少最后两列,因为它们是使用旧表定义创建的

对于基于Parquet的分区,Hive执行"模式合并",但不是将文件模式合并在一起(如Spark),而是将每个文件模式与表模式合并 - 忽略表中未定义的列和默认值为Null所有不在文件中的表列.

请注意,对于基于CSV的分区,它更加残酷,因为CSV文件没有"架构" - 它们只是按顺序列出了映射到表列的值列表.在达到EOL时,所有缺失的列都设置为Null; 在达到最后一列的值时,该行上的任何额外值都将被忽略.