我是Hive/hadoop的新手。我阅读/观看了与hive,hdfs,hadoop如何在内部工作相关的文档和视频。但我仍然无法立即理解一些事情。w.k.t Hive 数据存储为 hdfs 中的文件,表结构(模式)存储在元存储中。
-
由于 hive 在查询执行期间是只读架构,因此数据和架构相互集成并生成结果。请确认我对本声明的理解是否正确?
-
正如语句 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 路径信息在执行时由查询使用。
您的理解和我的验证/答案:
- 由于 hive 在查询执行期间是只读架构,因此数据和架构相互集成并生成结果。请确认我对本声明的理解是否正确?
答:正确
- 正如语句 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
希望对您有所帮助!