Внешняя таблица Hive против внутренних команд таблицы
Предполагая, что у меня есть эти две таблицы:
Внешний:
create external table emp_feedback (
emp_id int,
emp_name string
)
LOCATION '/user/hive/warehouse/mydb.db/contacts';
Внутренний:
create table emp_feedback (
emp_id int,
emp_name string
)
LOAD DATA INPATH 'file_location_of_csv' INTO TABLE emp_feedback;
- Когда я сказал:
LOCATION '/user/hive/warehouse/mydb.db/contacts';
для внешней таблицы это означает, что данные для этой таблицы находятся в каталоге'/user/hive/warehouse/mydb.db/contacts';
? Так что этот каталог должен существовать в HDFS до того, как он появится? - Могу ли я использовать
LOAD DATA INPATH...
дляexternal
таблица или это используется только дляinternal
столы. И наоборот я могу использоватьLocation...
для внутреннего стола?
2 ответа
- (а) Да. Вы правы, это означает, что данные находятся в этом месте / каталоге
(b) Нет. Каталог не должен существовать для создания схемы, Hive создаст каталог, если он не существует. Но в этом нет никакого смысла, так как ваша таблица будет пустой, поэтому ваш запрос будет пустым. Но в будущем вы можете переместить данные в это место и использовать эту таблицу.
(А)
LOAD DATA INPATH
может использоваться как для внешних, так и для внутренних таблиц. Когда вы это делаете, он перемещает данные в местоположение, указанное схемой (для внешних таблиц) или в/.../warehouse/...
(для внутренних таблиц)- (Б)
location
можно указывать как для внутренних, так и для внешних таблиц. Но когда вы удаляете внутреннюю таблицу, она также удаляет данные из этого расположения, тогда как для внешних таблиц удаляются только метаданные.
Команда load data inpath используется для загрузки данных в таблицу кустов. "LOCAL" означает, что входной файл находится в локальной файловой системе. Если "LOCAL" опущен, он ищет файл в HDFS.
load data inpath '/path/file.csv' into mytable;
load data local inpath '/Local path/file.csv' into mytable;
Эта команда удалит содержимое из исходного каталога и создаст внутреннюю таблицу
Ключевое слово LOCATION позволяет указывать на любое место HDFS для его хранения, а не храниться в папке, указанной свойством конфигурации hive.metastore.warehouse.dir.
Другими словами, с указанным LOCATION '/your path/' Hive не использует местоположение по умолчанию для этой таблицы. Это удобно, если у вас уже есть сгенерированные данные.
Помните, что LOCATION можно указывать только для ВНЕШНИХ таблиц. Для обычных таблиц будет использоваться местоположение по умолчанию. Создайте внешнюю таблицу и скопируйте данные в таблицу. Теперь данные не будут перемещены из источника. Вы можете удалить внешнюю таблицу, но исходные данные все еще доступны.
Когда вы удаляете внешнюю таблицу, она удаляет только метаданные таблицы HIVE. Данные все еще существуют в расположении файла HDFS.
Подводя итог, загрузите данные в inpath, чтобы указать кусту, где искать входные файлы, а ключевое слово LOCATION указывает кусту, где сохранять выходные файлы в HDFS.