Подтвердить что ты не робот

Получение нулевых значений при загрузке данных из плоских файлов в таблицы улей

Я получаю нулевые значения при загрузке данных из плоских файлов в таблицы улей.
моя структура таблиц такова:

hive> create table test_hive (id int,value string);

и мой плоский файл выглядит так: input.txt

1   a
2   b
3   c
4   d
5   e
6   F
7   G
8   j

когда я запускаю следующие команды, я получаю нулевые значения:

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;
hive> select * from test_hive;
OK<br>
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL

снимок экрана:

hive> create table test_hive (id int,value string);
OK
Time taken: 4.97 seconds
hive> show tables;
OK
test_hive
Time taken: 0.124 seconds
hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive;
Copying data from file:/home/hduser/input2.txt
Copying file: file:/home/hduser/input2.txt
Loading data to table default.test_hive
Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive
OK
Time taken: 0.572 seconds
hive> select * from test_hive;
OK
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
Time taken: 0.182 seconds
4b9b3361

Ответ 1

Терминатор поля по умолчанию в Hive равен ^ A. Вам нужно явно указать в инструкции create table, что вы используете другой разделитель полей.

Подобно тому, что указал Лоренд Бендинг в комментарии, используйте:

CREATE TABLE test_hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

Вам не нужно указывать местоположение, так как вы создаете управляемую таблицу (а не внешнюю таблицу).

Ответ 2

Проблема, с которой вы сталкиваетесь, заключается в том, что в ваших данных поля разделяются символом '', и при создании таблицы вы не указали разделитель полей. Поэтому, если вы не укажете разделитель поля при создании таблицы hive, по умолчанию hive рассматривает ^ A как разделитель.

Итак, чтобы решить вашу проблему, вы можете воссоздать таблицу, в которой упоминается синтаксис ниже, и это сработает.

CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

Ответ 3

Устанавливает список записей по умолчанию и разделителей полей по умолчанию:

  • \ п

  • ^ А

  • ^ B

  • ^ C

press ^ V ^ A может вставить a ^ A в Vim.

Ответ 4

Элементы разделены пробелом или вкладкой? Пусть он будет следовать этим шагам. Если разделенное пространство использует '' вместо '\ t' Ok.

hive> CREATE TABLE test_hive(id INT, value STRING) row format
   delimited fields terminated by '\t' line formated by '\n' stored as filename;

Чем вы должны ввести

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;

hive> select * from test_hive;

Теперь вы получите точный ожидаемый результат "имя файла".

Ответ 5

Решение довольно простое. Таблица не создана правильно.

Простое решение проблемы или каких-либо дальнейших проблем - это знание того, как загрузить данные.

CREATE TABLE [IF NOT EXIST] mytableName (id int, строка значений)

ФОРМАТ ROW DELIMITED

ПОЛЯ, ПРОВЕРЯЕМЫЕ '/t'

ЗАПОМНИТЬ КАК ТЕКСТИЧНЫЙ;

Теперь давайте объясним код:

  • Первая линия Создание таблицы. [IF NOT EXIST] является необязательным, если указано, существует ли таблица, не перезаписывать его. Его большая мера безопасности.

  • Вторая строка Задает разделитель на уровне таблицы для структурированных полей.

  • Третий элемент Вы можете включить любой отдельный символ, но по умолчанию это "\ 001". '/t' для пространства вкладок: в вашем случае '|' для данных, которые находятся рядом друг с другом и разделены | '' для одного пространства char. И так далее...

  • Forth Line: Указывает тип файла, в котором должны храниться данные. Файл может быть TEXTFILE, SEQUENCEFILE, RCFILE или BINARY SEQUENCEFILE. Или, как данные хранятся, могут быть указаны как классы ввода и вывода Java.

при загрузке Локально:

LOOD DATA LOCAL INPATH '/your/data/path.csv' [OVERWRITE] INTO TABLE myTableName;

Всегда проверяйте свои данные с помощью простого оператора select *.

Надеюсь, что это поможет.

Ответ 6

проверьте столбец даты набора данных, он должен соответствовать формату даты yyyy-mm-dd. Если строка имеет форму 'yyyy-mm-dd', то возвращается значение даты, соответствующее этому году/месяцу/дню. Если строковое значение не соответствует этому формату, то возвращается NULL. Улей Официальная документация

Ответ 7

Как сказали ребята:

  1. ПОЛЯ, ПРЕКРАЩЕННЫЕ "Сепаратором"

Дополнительно, если поле является datetime:

  1. Не забудьте удалить все пробелы.

Если, например, ваш разделитель равен ',' ваш плоский файл с полем даты должен выглядеть как '..., 2000-01-01,...'