2016-02-29 1 views
3

У меня есть запрос улей с CJK символов в файле, как показано ниже:Неправильная кодировка запроса при выполнении улей из файла

SELECT * FROM tbl WHERE name LIKE '日本語%'; 

И файл кодируется в UTF-8:

> file -bi query.hql 
text/plain; charset=utf-8 

Если Я исполняю его улей CLI, я могу получить ожидаемый результат:

> /path/to/hive -f query.hql 
some results here 

Теперь я хочу, чтобы выполнить этот запрос из Java. Так что я написал код, как:

String[] cmd = new String[]{"/bin/bash", "/my/script", "/path/to/query.hql", "/path/to/output.txt"}; 
ProcessBuilder pb = new ProcessBuilder(cmd); 
... 
pb.start(); 
... 

И /my/script выглядит следующим образом:

HQL_FILE=$1 
OUTPUT_FILE=$2 
/path/to/hive -f "${HQL_FILE}" > "${OUTPUT_FILE}" 

Я провел программу Java, но не получил никакого вывода. Я проверил файл журнала Hive и это похоже на проблему с кодировкой.

Если я бегу hive -f query.hql через оболочку, текст Дальневосточные правильно вошел в улей журнале:

> cat /tmp/myuser/hive.log 
2016-02-29 11:27:40,303 INFO [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command: ... name LIKE '日本語%' ... 

Но если я бегу через выше программы Java, журнал выглядит странно

> cat /tmp/myuser/hive.log 
2016-02-29 11:29:41,104 INFO [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command: ... name LIKE '???????%' ... 

Я исследовал эту проблему за полдня, но не смог найти никакой полезной информации.

Я ценю, если кто-нибудь может дать мне несколько советов.

PS:

  1. Hive Сервер не вариант. Мне нужно вызвать клиент hive через оболочку.
  2. Я использую Hive 0.14.0.
+0

Из командной строки это похоже на Unix-подобную систему (Linux? Mac OS X? Other? Или это Windows + cygwin?). Каковы различия в среде между процессом Java и командной строкой? – fge

+0

Клиент куста и программа Java выполняются из CentOS 6.3. – Joka

+0

Да, однако это не значит, что их окружение будет одинаковым!Я говорю о переменных среды процесса – fge

ответ

3

Предполагая, что программа Java не пишет сам HQL файл, в оболочке, где улей команда работает, запустите следующую команду:

echo $LANG 

Вы, вероятно, получите что-то вроде en_US.UTF-8.

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

pb.environment().put("LANG", "en_US.UTF-8"); 

(Используйте любое значение, которое вы получили вместо en_US.UTF-8)

Если ваш Java-программа записывает сам файл hql, тогда есть еще кое-что, о чем нужно беспокоиться: когда вы открываете файл, вы должны указать кодировку UTF-8 для вывода. Как это сделать, это будет зависеть от того, как вы открываете файл.

+0

Другой вариант заключается в том, чтобы поместить это в свой скрипт, прежде чем вызывать улей: 'export LANG = en_US.UTF-8' –

+0

ДА ДА ДА! Работает скрипт 'export LANG = en_US.UTF-8'! Большое спасибо. Но не знаю почему, 'pb.environment(). Put (" LANG "," en_US.UTF-8 ");' Решение не работает. Я 'echo $ LANG>/tmp/lang.txt' в'/my/script' перед вызовом куста, а выход - пустая строка. – Joka

+0

Единственное, что я могу предположить, это то, что что-то очищает среду ProcessBuilder, прежде чем вы вызовете 'pb.start()'. Существуют ли какие-либо строки, которые выглядят так? –

Смежные вопросы