У меня есть запрос улей с 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:
- Hive Сервер не вариант. Мне нужно вызвать клиент hive через оболочку.
- Я использую Hive 0.14.0.
Из командной строки это похоже на Unix-подобную систему (Linux? Mac OS X? Other? Или это Windows + cygwin?). Каковы различия в среде между процессом Java и командной строкой? – fge
Клиент куста и программа Java выполняются из CentOS 6.3. – Joka
Да, однако это не значит, что их окружение будет одинаковым!Я говорю о переменных среды процесса – fge