Ваше понимание относительно "данных Hive хранятся в виде файлов в формате hdf, а структура таблиц (схема) хранится в метастазе".верно.Но в дополнение к схеме Metastore также содержит данные каталога 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, сначала запрос будет скомпилирован, и произойдет выполнение с данными из пути HDFS, полученного из Has Metastore.
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
Надеюсь, это поможет!