我在下面的文件中有一个带有CJK字符的Hive查询:
SELECT * FROM tbl WHERE name LIKE '日本語%';
文件以UTF-8编码:
> file -bi query.hql
text/plain; charset=utf-8
如果我使用Hive 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日志文件,它看起来像编码问题。
如果我通过shell运行hive -f query.hql
,则在hive日志中正确记录了CJK文本:
> 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:
答案 0 :(得分:3)
假设Java程序本身没有编写hql文件,在hive命令工作的shell中运行以下命令:
echo $LANG
你可能会得到类似en_US.UTF-8
的内容。
获取您获得的任何值,并在创建ProcessBuilder后修改您的Java程序:
pb.environment().put("LANG", "en_US.UTF-8");
(使用你得到的任何值而不是en_US.UTF-8)
如果您的Java程序本身正在编写hql文件,那么还需要担心其他问题:当您打开文件时,您应该为输出指定UTF-8编码。如何做到这在一定程度上取决于你如何打开文件。