2016-06-30 3 views
0

У меня есть очень простой вопрос, который: Как добавить очень простую таблицу в Hive. Моя таблица сохраняется в текстовом файле (.txt), который сохраняется в HDFS. Я попытался создать внешнюю таблицу в Hive, которая указывает на этот файл, но когда я запускаю SQL-запрос (выберите * из table_name), я не получаю никакого вывода. Вот пример кода:Добавление таблицы с разделителями-запятыми в Hive

create external table Data (
    dummy INT, 
    account_number INT, 
    balance INT, 
    firstname STRING, 
    lastname STRING, 
    age INT, 
    gender CHAR(1), 
    address STRING, 
    employer STRING, 
    email STRING, 
    city STRING, 
    state CHAR(2) 
) 
LOCATION 'hdfs:///KibTEst/Data.txt'; 

KibTEst/data.txt путь текстового файла в HDFS.

Строки в таблице разделены возвратом каретки, а столбцы разделяются запятыми.

Благодарим за помощь!

+0

файл в HDFS или таблицы ?? – Farooque

ответ

2
  1. Вам просто нужно создать внешнюю таблицу, указывающую на ваш файл место в HDFS и свойств разделителей, как показано ниже:

    create external table Data (
        dummy INT, 
        account_number INT, 
        balance INT, 
        firstname STRING, 
        lastname STRING, 
        age INT, 
        gender CHAR(1), 
        address STRING, 
        employer STRING, 
        email STRING, 
        city STRING, 
        state CHAR(2) 
    ) 
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n' 
    LOCATION 'hdfs:///KibTEst/Data.txt'; 
    
  2. Вам необходимо запустить select запрос (поскольку файл уже находится в HDFS, а внешняя таблица напрямую извлекает данные из него, когда местоположение указано в инструкции create). Таким образом, вы проверить с помощью ниже оператора выбора:

SELECT * FROM Data;

+0

Используя этот код, таблица может быть успешно создана, но когда я запускаю SQL-запрос, он не возвращает никакого вывода (он возвращает только OK). Похоже, что таблица в Улье пуста. Я дважды проверил содержимое таблицы в HDFS, запустив 'hadoop fs -cat/KibTest/Data.txt', который возвращает содержимое таблицы. – mshabeeb

+0

вы обновляете местоположение как «/KibTest/Data.txt», тогда вы получите результат, потому что если вы запустите «hadoop fs -cat hdfs: ///KibTEst/Data.txt», вы ничего не получите ... – Farooque

+0

дал тот же результат. Однако удаление имени файла из пути (так что местоположение становится '/ KibTest /') выполняет задание, хотя все файлы в каталоге вставляются в таблицу! Поэтому мне нужно создать новый каталог и переместить в него только этот файл. Вы знаете, есть ли способ ограничить ввод одним файлом в пути? – mshabeeb

0
create external table Data (
     dummy INT, 
     account_number INT, 
     balance INT, 
     firstname STRING, 
     lastname STRING, 
     age INT, 
     gender CHAR(1), 
     address STRING, 
     employer STRING, 
     email STRING, 
     city STRING, 
     state CHAR(2) 
    ) 
    row format delimited  
    FIELDS TERMINATED BY ‘,’ 
    stored as textfile 
    LOCATION 'Your hdfs location for external table'; 

Если данные в HDFS затем использовать:

LOAD DATA INPATH 'hdfs_file_or_directory_path' INTO TABLE tablename 

Использование select * from table_name

+0

Спасибо большое! В разделе «Ваше местоположение hdfs для внешней таблицы» вы имеете в виду местоположение в HDFS (т. Е. 'Hdfs: /// KibTEst/Data.txt')? В чем разница между этим и «hdfs_file_or_directory_path»? – mshabeeb

0
create external table Data (
     dummy INT, 
     account_number INT, 
     balance INT, 
     firstname STRING, 
     lastname STRING, 
     age INT, 
     gender CHAR(1), 
     address STRING, 
     employer STRING, 
     email STRING, 
     city STRING, 
     state CHAR(2) 
    ) 
    row format delimited  
    FIELDS TERMINATED BY ',' 
    stored as textfile 
    LOCATION '/Data'; 

Затем загрузить файл в таблицу

LOAD DATA INPATH '/KibTEst/Data.txt' INTO TABLE Data; 

Тогда

select * from Data; 
+0

Спасибо за ваш ответ! Я попытался ввести одну и ту же команду, но я получил следующую ошибку (ранее это одна из нескольких опций, и я всегда получал ту же ошибку): Строка ParseException 16:26 Неисправный ввод ',' ожидающий StringLiteral рядом с 'BY' в таблице разделитель полей формата строки – mshabeeb

+0

перейти к обновленному ответу. Проблема была «,» –

+0

Теперь таблица может быть создана без ошибок, но когда я проверяю ее содержимое, запустив SQL-запрос 'select * from Data', я не получаю выход (только ОК). Использование команды Load не работает, но дает следующую ошибку: ** FAILED: SemanticException Line 1:17 Недопустимый путь '' /KibTEst/Data.txt ': Нет файлов, соответствующих пути hdfs: // MACHINE_NAME/KibTEst/Data .txt ** Я попытался изменить путь к 'hdfs: /// KibTEst/Data.txt', но он дает точно такую ​​же ошибку (с тем же путем). Однако я считаю, что инструкция load не нужна, поскольку таблица является внешней и данные существуют в HDFS – mshabeeb

0

Я надеюсь, ниже входа попытается ответить на вопрос, заданный @mshabeen.

Существуют разные способы загрузки данных в таблицу Hive, которая создается как внешняя таблица. При создании внешней таблицы Hive вы можете использовать опцию LOCATION и указать HDFS, S3 (в случае AWS) или местоположение файла, откуда вы хотите загрузить данные ИЛИ вы можете использовать опцию LOAD DATA INPATH для загрузки данных из HDFS , S3 или Файл после создания таблицы Hive.

В качестве альтернативы вы также можете использовать команду ALTER TABLE для загрузки данных в разделах Hive.

Ниже приведены некоторые детали

  1. Использование LOCATION - Используется при создании таблицы улей. В этом случае данные уже загружены и доступны в таблице Hive.

  2. **LOAD DATA INPATH** option - Эта команда Hive может использоваться для загрузки данных из указанного места. Здесь следует помнить, что данные передаются от пути ввода к пути хранилища Hive. Пример - LOAD DATA INPATH 'hdfs://cluster-ip/path/to/data/location/'

  3. Использование ALTER TABLE команды - Чаще всего это используется для добавления данных из других мест в разделах улья. В этом случае требуется, чтобы все разделы уже были определены, а значения для разделов уже известны. В случае динамических разделов эта команда не требуется. Пример: ALTER TABLE table_name ADD PARTITION (date_col='2018-02-21') LOCATION 'hdfs/path/to/location/' Приведенный выше код отображает раздел в указанное место данных (в данном случае HDFS). Тем не менее, данные НЕ ПЕРЕМЕИВАЮТ, чтобы удержать внутреннее местоположение склада.

Дополнительная информация доступна here

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