Hive 数据和元存储如何相互通信和集成?



我是Hive/hadoop的新手。我阅读/观看了与hive,hdfs,hadoop如何在内部工作相关的文档和视频。但我仍然无法立即理解一些事情。w.k.t Hive 数据存储为 hdfs 中的文件,表结构(模式)存储在元存储中。

  1. 由于 hive 在查询执行期间是只读架构,因此数据和架构相互集成并生成结果。请确认我对本声明的理解是否正确?

  2. 正如语句 1 告诉我们的集成,集成是如何发生的?就像存储在hdfs中的文件(实际数据)没有模式权限一样。mapreduce/hadoop/hive如何知道"存储在文件中的这个特定数据"属于"表的这个特定列"。不会有数据不匹配吗?

我认为关闭配置单元数据文件看起来像,

students.txt
-------------
1 abc m@gmail.com
-------------------
2 xyz@ymail.com
---------------

上面的文件不存储架构。因此,对于s_id 2 的学生,不会存储该名称。这些东西是如何被捕获的?何时执行查询?我不认为 xyz@gmail.com 会被整合到student_name领域。但仍然想知道集成是如何发生的?

您对"Hive 数据存储为 hdfs 中的文件,表结构(模式)存储在元存储中"的理解是正确的。但除了架构之外,元存储还具有存储表数据的 HDFS 目录详细信息。此 HDFS 路径信息在执行时由查询使用。

您的理解和我的验证/答案:

  1. 由于 hive 在查询执行期间是只读架构,因此数据和架构相互集成并生成结果。请确认我对本声明的理解是否正确?

答:正确

  1. 正如语句 1 告诉我们集成时,集成是如何发生的?就像存储在hdfs中的文件(实际数据)没有模式权限一样。mapreduce/hadoop/hive如何知道"存储在文件中的这个特定数据"属于"表的这个特定列"。不会有数据不匹配吗?

答:

存储在HDFS上的文件(例如文本文件)是表的一部分,其中没有结构或列名称,而只是数据。但是,创建表时,我们必须清楚地提及列以及它们在文本文件中的存储方式。假设 2 列和逗号分隔的数据将有一个如下所示的查询,

create table default.column_test 
(name string,
email string)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','

因此,数据文件,即HDFS路径中存在的文本文件应具有以下格式的数据。

alpha,alpha@email.com
beta,beta@email.com

当使用 SELECT 查询从此表中查询数据时,将首先编译查询,并将对派生自 Hive 元存储的 HDFS 路径中的数据执行。

SELECT * FROM column_test;
column_test.name    column_test.email
1   Alpha               alpha@email.com
2   Beta                beta@email.com

如果文件中的数据没有列名的值,(如下所示)

alpha@email.com
beta,beta@email.com

然后,SELECT 查询会将"alpha@email.com"视为列"name"的值,并将返回 NULL 作为第一条记录的列"电子邮件"的值。输出将如下所示,

SELECT * FROM column_test;
column_test.name    column_test.email
1   alpha@email.com     NULL
2   Beta                beta@email.com

希望对您有所帮助!