Пробелы вместо NULL в таблице Hive после импорта Sqoop - PullRequest
0 голосов
/ 05 апреля 2019

Я создал процесс sqoop, который импортирует данные из MS SQL в Hive, но у меня проблема с полями типа 'char'. Код импорта Sqoop:

sqoop import \
    --create-hcatalog-table \
    --connect "connection_parameters" \
    --username USER \
    --driver net.sourceforge.jtds.jdbc.Driver \
    --null-string '' \
    --null-non-string '' \
    --class-name TABLE_X \
    --hcatalog-table TABLE_X_TEST \
    --hcatalog-database default \
    --hcatalog-storage-stanza "stored as orc tblproperties ('orc.compress'='SNAPPY')" \
    --map-column-hive "column_1=char(10),column_2=char(35)" \
    --num-mappers 1 \
    --query "select top 10 "column_1", "column_2" from TABLE_X where \$CONDITIONS" \
    --outdir "/tmp"

column_1 типа char(10) должно быть NULL, если нет данных. Но улей заполняет поле 10 пробелами.

column_2 типа char(35) тоже должно быть NULL, но есть 35 пробелов.

Это огромная проблема, потому что я не могу выполнить запрос следующим образом:

select count(*) from TABLE_X_TEST where column_1 is NULL and column_2 is NULL;

Но я должен использовать это:

select count(*) from TABLE_X_TEST where column_1 = '          ' and column_2 = '                                   ';

Я попытался изменить параметр запроса и использовать функцию обрезки:

--query "select top 10 rtrim(ltrim("column_1")), rtrim(ltrim("column_2")) from TABLE_X where \$CONDITIONS"

но это не работает, поэтому я полагаю, что это не проблема с источником, а с Hive.

Как я могу запретить Hive вставлять пробелы в пустые поля?

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Вам необходимо изменить эти параметры:

--null-string '\\N' \
--null-non-string '\\N' \

По умолчанию Hive ожидает, что значение NULL будет закодировано с использованием строковой константы \N. Sqoop по умолчанию кодирует его, используя строковую константу null. Чтобы исправить несоответствие, вам нужно переопределить поведение Sqoop по умолчанию с помощью Hive с использованием параметров --null-string и --null-non-string (это то, что вы делаете, но с неверными значениями). Подробнее см. документы .

0 голосов
/ 07 мая 2019

Я пытался без указания параметров null-string и null-non-string для создания таблиц орков с помощью Sqoop hcatalog, все нули в исходном тексте отображаются как NULL, и я могу запросить, используя нулевую функцию.

Дайте мне знать, если вы нашли какое-либо другое решение для обработки нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...