我是蜂巢/强子的新手。我阅读/观看了文档,有关配置单元,hdfs和hadoop内部工作方式的视频。但是我仍然无法立即了解一些事情。 w.k.t Hive数据以文件形式存储在hdfs中,表结构(模式)存储在metastore中。
因此,配置单元是在查询执行期间处于只读状态的架构,数据和架构相互集成并产生结果。请确认我对这句话的理解是正确的吗?
正如语句1告诉我们有关集成的信息,集成是如何发生的?就像存储在hdfs中的文件(实际数据)没有架构权限一样。 mapreduce / hadoop / hive如何知道“存储在文件中的此特定数据”属于“表的此特定列”。会不会有数据不匹配?
我会考虑一下蜂巢数据文件的样子,
students.txt
-------------
1 abc m@gmail.com
-------------------
2 xyz@ymail.com
---------------
以上文件不存储架构。因此,对于具有s_id 2的学生,不会存储该名称。这些东西是如何被捕获的?查询何时执行?我认为xyz@gmail.com不会集成在student_name字段下。但是仍然想知道整合是如何发生的吗?
答案 0 :(得分:0)
您对“ Hive数据作为文件存储在hdfs中,而表结构(模式)存储在metastore中”的理解。是正确的。但是除了架构之外,Metastore还具有存储表数据的HDFS目录详细信息。该HDFS路径信息在执行时由查询使用。
您的理解和我的确认/答案:
答案:正确
答案:
作为表一部分存储在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
希望有帮助!