Получение нулевых значений при загрузке данных из плоских файлов в таблицы улей
Я получаю нулевые значения при загрузке данных из плоских файлов в таблицы улей.
моя структура таблиц такова:
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
Ответы
Ответ 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
Устанавливает список записей по умолчанию и разделителей полей по умолчанию:
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
Как сказали ребята:
- ПОЛЯ, ПРЕКРАЩЕННЫЕ "Сепаратором"
Дополнительно, если поле является datetime:
- Не забудьте удалить все пробелы.
Если, например, ваш разделитель равен ',' ваш плоский файл с полем даты должен выглядеть как '..., 2000-01-01,...'