Apache spark SPARK蜂巢从表格模式处理的角度看蜂巢和拼花之间的关键区别

Apache spark SPARK蜂巢从表格模式处理的角度看蜂巢和拼花之间的关键区别,apache-spark,hive,Apache Spark,Hive,我是新来的。我不明白这个说法 Hive认为所有列都可以为空,而拼花地板中的空性非常重要 如果有人用例子来解释这句话,对我来说会更好。感谢您的支持。在标准SQL语法中,创建表时,您可以声明特定列可为空,即可能包含空值或不包含空值,即尝试插入/更新空值将引发错误。默认值为空 拼花模式语法支持相同的概念,但在使用AVRO序列化时,默认为NOTNULLABLE。 警告-使用Spark读取多个拼花文件时,这些文件可能具有不同的模式。假设模式定义随着时间的推移而改变,并且较新的文件在末尾还有两个可为空的列。

我是新来的。我不明白这个说法

Hive认为所有列都可以为空,而拼花地板中的空性非常重要

如果有人用例子来解释这句话,对我来说会更好。感谢您的支持。

在标准SQL语法中,创建表时,您可以声明特定列可为空,即可能包含空值或不包含空值,即尝试插入/更新空值将引发错误。默认值为空

拼花模式语法支持相同的概念,但在使用AVRO序列化时,默认为NOTNULLABLE。 警告-使用Spark读取多个拼花文件时,这些文件可能具有不同的模式。假设模式定义随着时间的推移而改变,并且较新的文件在末尾还有两个可为空的列。然后,您必须请求模式合并,以便Spark从所有文件中读取模式,而不是随机读取一个,以确保所有这些模式都兼容,然后在读取时,对于较旧的文件,未定义的列默认为Null

配置单元HQL语法不支持标准SQL功能;每一列都是且必须是可空的——这仅仅是因为配置单元对其数据文件没有完全控制权! 想象一个有2个分区的配置单元分区表

一个分区使用文本文件格式,包含来自的CSV转储 不同的源,一些显示所有预期的列,一些缺少 最后2列,因为它们使用较旧的定义 第二个分区对历史使用拼花格式,由配置单元INSERT-SELECT查询创建,但较旧 拼花地板文件也缺少最后2列,因为它们是使用旧的表定义创建的 对于基于拼花地板的分区,Hive进行模式合并,但它没有像Spark那样将文件模式合并在一起,而是将每个文件模式与表模式合并—忽略表中未定义的列,并默认为空文件中未定义的所有表列

请注意,对于基于CSV的分区来说,这要残酷得多,因为CSV文件没有模式——它们只有一个按顺序映射到表列的值列表。到达EOL时,所有缺少的列都设置为Null;在达到最后一列的值时,该行上的任何额外值都将被忽略。

在标准SQL语法中,当您创建表时,您可以声明特定列可为Null,即可能包含Null值或不包含Null值,即尝试插入/更新Null值将抛出错误。nullable是默认值

拼花模式语法支持相同的概念,但在使用AVRO序列化时,默认为NOTNULLABLE。 警告-使用Spark读取多个拼花文件时,这些文件可能具有不同的模式。假设模式定义随着时间的推移而改变,并且较新的文件在末尾还有两个可为空的列。然后,您必须请求模式合并,以便Spark从所有文件中读取模式,而不是随机读取一个,以确保所有这些模式都兼容,然后在读取时,对于较旧的文件,未定义的列默认为Null

配置单元HQL语法不支持标准SQL功能;每一列都是且必须是可空的——这仅仅是因为配置单元对其数据文件没有完全控制权! 想象一个有2个分区的配置单元分区表

一个分区使用文本文件格式,包含来自的CSV转储 不同的源,一些显示所有预期的列,一些缺少 最后2列,因为它们使用较旧的定义 第二个分区对历史使用拼花格式,由配置单元INSERT-SELECT查询创建,但较旧 拼花地板文件也缺少最后2列,因为它们是使用旧的表定义创建的 对于基于拼花地板的分区,Hive进行模式合并,但它没有像Spark那样将文件模式合并在一起,而是将每个文件模式与表模式合并—忽略表中未定义的列,并默认为空文件中未定义的所有表列

请注意,对于基于CSV的分区来说,这要残酷得多,因为CSV文件没有模式——它们只有一个按顺序映射到表列的值列表。到达EOL时,所有缺少的列都设置为Null;达到最后一列的值时,将忽略该行上的任何额外值