Как мы можем заменить значение переменных улья, чтобы проверить наличие ошибок - PullRequest
0 голосов
/ 15 октября 2018

У нас есть запрос, в котором мы определили более 50 переменных.

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

Example
set hive var0=value0;
set hive var1=value1;
set hive var2=value2;

select * from ${hiveconf:var0} where col1=${hiveconf:var1} and col2=${hiveconf:var2};

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

Пожалуйста, дайте мне знать о любых альтернативах.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

вместе с пространством имен hivevar, мы можем использовать еще одно свойство hive.root.logger = INFO, console.

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

 cat test.hql
set hivevar:var1=${hivevar:var11};
set hivevar:var2=2345;

select ${hivevar:var11};
select ${hivevar:var2};

команда куста - hive --hiveconf hive.root.logger=INFO,console --hivevar var11=1234 -f test.hql

вывод на консоль

select 1234
2018-10-17T08:23:31,632  INFO [main] ql.Driver: Completed executing command(queryId=-4dd6-493f-88be-03810f847fe7); Time taken: 0.003 seconds
OK
2018-10-17T08:23:31,632  INFO [main] ql.Driver: OK
2018-10-17T08:23:31,670  INFO [main] io.NullRowsInputFormat$NullRowsRecordReader: Using null rows input format
1234
0 голосов
/ 16 октября 2018

Лучше использовать hivevar пространство имен для того же самого.

Вы можете распечатать все переменные, используя команду ! echo:

set hivevar:var0=value0;
hive> ! echo  Variable hivevar:var0 is ${hivevar:var0};

Результат:

Variable hivevar:var0 is value0

Также используйте explain extended <query> - он напечатает подробный план запроса с предикатами и потерпит неудачу, если это синтаксическая ошибка.

Обновление: также вы можете использовать SELECT для того же, и Hive может выполнять простые запросы без запуска MR, если *Для 1014 * установлено значение more или minimal.Если вы используете Qubole, добавьте также limit 1 к запросу:

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', '${hivevar:var0}' limit 1;

Почему вам может потребоваться сделать это с помощью SELECT?Например, для простой проверки параметров с использованием приведения или некоторой UDF.Если вам нужно проверить, имеет ли параметр тип DATE, используйте

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', date '${hivevar:var0}' limit 1;

В этом случае, если ${hivevar:var0} не является датой, исключение приведения типа будет выдано, и выполнение скрипта будет прекращено.

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