从文件执行Hive时查询编码不正确

时间:2016-02-29 12:14:20

标签: java hadoop encoding utf-8 hive

我在下面的文件中有一个带有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:

  1. Hive Server不是一个选项。我必须通过shell调用hive客户端。
  2. 我使用的是Hive 0.14.0。

1 个答案:

答案 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编码。如何做到这在一定程度上取决于你如何打开文件。