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

时间:2016-12-10 05:07:14

标签: apache-spark hive

我是火花和蜂巢的新手。我不明白这句话

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

如果有人用例子解释声明,那对我来说会更好。谢谢你。

1 个答案:

答案 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个分区...

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

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

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