it-swarm.com.ru

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

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

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
15
user1823697

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

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

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

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

19
Mark Grover

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

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

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

6
Mufaddal Kamdar

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

  1. \ п

  2. ^ а

  3. ^ B

  4. ^ C

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

1
songhir

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

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

CREATE TABLE [ЕСЛИ НЕ СУЩЕСТВУЕТ] mytableName (id int, строка значения)

ROW FORMAT DELIMITED

ПОЛЯ, ПРЕКРАЩЕННЫЕ «/ т»

Хранится в текстовом виде;

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

  1. Первая строка Создание вашей таблицы. Параметр [ЕСЛИ НЕ СУЩЕСТВУЕТ] является необязательным и указывает, что таблица существует, но не перезаписывайте ее. Это больше меры безопасности.

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

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

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

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

LOCD DATA LOCAL INPATH '/your/data/path.csv' [ПЕРЕЗАПИСАТЬ] В ТАБЛИЦУ myTableName;

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

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

1
user 451

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

1
Shekh Firoz Alam

Элементы разделены пробелом или табуляцией? Пусть это вкладка, выполните следующие действия. Если разделенный пробел, используйте '' вместо '\ 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;

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

1
Venu A Positive