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

时间:2019-04-01 10:22:00

标签: hadoop hive hdfs

我是蜂巢/强子的新手。我阅读/观看了文档,有关配置单元,hdfs和hadoop内部工作方式的视频。但是我仍然无法立即了解一些事情。 w.k.t Hive数据以文件形式存储在hdfs中,表结构(模式)存储在metastore中。

  1. 因此,配置单元是在查询执行期间处于只读状态的架构,数据和架构相互集成并产生结果。请确认我对这句话的理解是正确的吗?

  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字段下。但是仍然想知道整合是如何发生的吗?

1 个答案:

答案 0 :(得分:0)

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

您的理解和我的确认/答案:

  1. 因此,配置单元是在查询执行期间处于只读状态的架构,数据和架构相互集成并产生结果。请确认我对这句话的理解正确吗?

答案:正确

  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 Metastore派生的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”视为“名称”列的值,并为第一条记录返回NULL作为“电子邮件”列的值。输出将如下所示,

SELECT * FROM column_test;

    column_test.name    column_test.email

1   alpha@email.com     NULL
2   Beta                beta@email.com

希望有帮助!