我正在尝试将hdfs文件从 UTF-8
至 ISO-8859-1
.
我编写了一个小java程序:
String theInputFileName="my-utf8-input-file.csv";
String theOutputFileName="my-iso8859-output-file.csv";
Charset inputCharset = StandardCharsets.UTF_8;
Charset outputCharset = StandardCharsets.ISO_8859_1;
try (
final FSDataInputStream in = theFileSystem.open(new Path(theInputFileName)) ;
final FSDataOutputStream out = theFileSystem.create(new Path(theOutputFileName))
)
{
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(in, inputCharset)))
{
String line;
while ((line = reader.readLine()) != null)
{
out.write(line.getBytes(this.outputCharset));
out.write(this.lineSeparator.getBytes(this.outputCharset));
}
}
} catch (IllegalArgumentException | IOException e)
{
RddFileWriter.LOGGER.error(e, "Exception on file '%s'", theFileNameOutput);
}
此代码通过hadoop集群执行,使用 Spark
(输出数据通常由rdd提供)
为了简化我的问题,我删除了rdd/datasets部分,直接处理hdfs文件。
当我执行代码时:
在我的开发人员计算机上:它工作!,本地输出文件编码为 ISO-8859-1
在边缘服务器上:通过spark提交命令使用hdfs文件,它的作品!hdfs输出文件编码为 ISO-8859-1
通过oozie在datanode上:它不工作:-(:hdfs outfile编码为 UTF-8
而不是 ISO-8859-1
我不明白是什么属性(或其他东西)导致了行为的改变
版本:
hadoop:v2.7.3版
spark:v2.2.0版
java:1.8版本
期待您的帮助。提前谢谢
1条答案
按热度按时间wecizke31#
最后,我找到了问题的根源。
群集上的输入文件已损坏,整个文件没有恒定且一致的编码。
外部数据每天汇总,最近编码已从iso更改为utf8,没有通知。。。
简单地说:
开始包含错误的转换« 㩠㪠㨠» 而不是« é ê è »
结尾编码正确
我们已经拆分、修复了编码并合并了数据以修复输入。
最后的代码运行良好。
停止你的研究!;—)