2015-09-04 2 views
1

я создал внешнюю таблицу в Hive используя следующее:Где хранятся метаданные HIVE по умолчанию?

create external table hpd_txt(
WbanNum INT, 
YearMonthDay INT , 
Time INT, 
HourlyPrecip INT) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
stored as textfile 
location 'hdfs://localhost:9000/user/hive/external'; 

Теперь эта таблица создается в папке */hive/external.

Шаг-1: Я загрузил данные в этой таблице, используя:

load data inpath '/input/hpd.txt' into table hpd_txt; 

данные успешно загружены по указанному пути (*/external/hpd_txt)

Шаг 2: я удалить таблица от */hive/external Путь, используя следующие данные:

hadoop fs -rmr /user/hive/external/hpd_txt 

Вопросы:

  1. Почему таблица удалена из исходного пути? (*/input/hpd.txt удаляется из hdfs, но таблица создается в */external path)
  2. После удаления таблицы из HDFS, как на шаге 2, и снова использую show tables; Он по-прежнему дает таблицу hpd_txt во внешнем пути. поэтому откуда это.

Заранее спасибо.

ответ

0

Пройдя через вас, помогая мне в комментариях и других сообщениях, я нашел ответ на свой вопрос. Если я использую команду LOAD INPATH, она «перемещает» исходный файл в место, где создается внешняя таблица. Который, хотя, не будет затронут в случае падения таблицы, но изменение местоположения не очень хорошо. Поэтому используйте локальный путь inpath в случае загрузки данных во внутренние таблицы.

Для загрузки данных во внешних таблицах из файла, расположенный в HDFS, используйте расположение в СОЗДАТЬ таблицы запроса, который будет указывать на исходный файл, например:

create external table hpd(WbanNum string, 
YearMonthDay string , 
Time string, 
hourprecip string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
stored as textfile 
location 'hdfs://localhost:9000/input/hpd/'; 

Так что этот образец место укажет к данным, уже представленным в HDFS на этом пути. поэтому нет необходимости использовать команду LOAD INPATH.

Хорошая практика хранения исходных файлов в частных специализированных каталогах. Так что нет никакой двусмысленности, в то время как внешние таблицы создаются, поскольку данные находятся в правильно управляемой системе каталогов.

Большое спасибо за помощь в понимании этой концепции ребят! Ура!

1

Улей не знает, что вы удалили файлы. Hive все еще ожидает найти файлы в указанном вами местоположении. Вы можете делать все, что захотите, в HDFS, и это не передается в улей. Вы должны сказать куст, если все изменится.

hadoop fs -rmr /user/hive/external/hpd_txt 

Например, приведенная выше команда не удаляет таблицу, она просто удаляет файл. Стол по-прежнему существует в метафоре улья. Если вы хотите удалить таблицу, то используйте:

drop if exists tablename; 

Поскольку вы создали таблицу в качестве внешней таблицы это будет удалить таблицу из улья. Файлы остаются, если вы их не удалили. Если вы хотите удалить внешнюю таблицу и файлы таблица чтения из вас могут сделать одно из следующих действий:

  1. падения таблицы, а затем удалить файлы
  2. Измените таблицу управляемый и удалить таблицу

Идентификация местоположения метастара для улья по умолчанию находится здесь /usr/hive/warehouse.

+0

Спасибо invoketheshell для уточнения! Еще одна вещь, которую я хочу знать, - это то, почему файл в HDFS, который загружается в таблицу, удален из его пути, где он был первоначально сохранен с использованием команды -copyFromLocal? –

+0

-copyFromLocal - это то же самое, что и я. Он должен скопировать файл и поместить его в указанный пункт назначения внутри HDFS. – invoketheshell

+0

На самом деле я заметил одно. Когда я создаю таблицу в месте, скажите /dir......и затем загрузите данные в таблицу (загрузите данные inpath ....), файл больше не находится на более раннем пути (который копируется в) , но теперь присутствует в пути/dir. Это потому, что данные все еще находятся в hdfs, но путь просто изменяется? –

0

Ключевое слово ВНЕШНИЕ позволяет создать таблицу и предоставить LOCATION, чтобы Hive не использовал местоположение по умолчанию для этой таблицы. Это удобно, если у вас уже есть данные. Кроме того, у вас будут загружены данные (обычно или путем создания файла в каталоге, на который указывает таблица улей) При отбрасывании таблицы EXTERNAL данные в таблице НЕ удаляются из файловой системы. Таблица EXTERNAL указывает на любое местоположение HDFS для хранения, а не хранится в папке, заданной свойством конфигурации hive.metastore.warehouse.dir.

Источник: Hive docs

Таким образом, в вашем шаге 2, удаление файла/пользователь/улей/внешний/hpd_txt удаляет источник данных (данные, указывающие на таблицу), но таблица все еще существует и будет продолжать указывать в hdfs: // localhost: 9000/user/hive/external, поскольку он был создан

@Anoop: Не уверен, что это отвечает на ваш вопрос. сообщите мне, если у вас возникнут вопросы.

+0

Привет Anil. Спасибо за ответ. Да, это помогло мне усомниться. Но главное сомнение еще не принято. (Я упомянул об этом в качестве комментария к вышеуказанному ответу). Пожалуйста, помогите :) –

+0

@Anoop Могу ли я узнать, что именно вы беспокоитесь ... или, может быть, вы можете просто включить его как часть своего вопроса. – Anil

0
  1. Не используйте команду путь нагрузки. Операция Load используется для ПЕРЕДВИЖЕНИЯ (не COPY) данных в соответствующую таблицу Hive. Используйте put или copyFromLocal для копирования файла из формата без HDFS в формат HDFS. Просто укажите расположение файла HDFS в таблице create после выполнения команды put.

  2. Удаление таблицы не удаляет файл HDFS с диска. Это преимущество внешней таблицы. Таблицы Hive просто хранят метаданные для доступа к файлам данных. Таблицы верстки хранят фактические данные файла данных в таблицах HIVE. Если вы отбросите таблицу, файл данных не будет затронут в местоположении файла HDFS. Но в случае внутренних таблиц обе метаданные и данные будут удалены, если вы отбросите таблицу.

Смежные вопросы