gpt4 book ai didi

java - HDFS文件编码转换器

转载 作者:行者123 更新时间:2023-12-02 18:56:18 25 4
gpt4 key购买 nike

我正在尝试将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);
}
此代码使用 Spark通过Hadoop集群执行(输出数据通常由RDD提供)
为了简化我的问题,我删除了RDD / Datasets部分以直接在HDFS File上工作。
当我执行代码时:
  • 我的DEV计算机上的本地化:有效!,本地输出文件编码为ISO-8859-1
  • 上的
  • EDGE服务 r:通过使用HDFS文件的spark-submit命令起作用! HDFS输出文件编码为ISO-8859-1
  • 通过oozie 在 Datanode上的
  • :不起作用:-(:HDFS输出文件以UTF-8编码,而不是ISO-8859-1

  • 我不知道是什么属性(或其他原因)引起了行为上的改变
    版本:
  • Hadoop:v2.7.3
  • Spark:v2.2.0
  • Java:1.8

  • 期待您的帮助。
    提前致谢

    最佳答案

    最后,我找到了问题的根源。
    群集上的输入文件已损坏,整个文件没有恒定一致的编码。
    每天都会收集外部数据,最近,编码已从ISO更改为UTF8,恕不另行通知...
    简单地说:

  • 开始时包含错误的转换«ÃªÃû,而不是«éè»
  • 末端已正确编码

  • 我们已经拆分,修复了编码并合并了数据以修复输入。
    最终代码可以正常工作。
    private void changeEncoding(
    final Path thePathInputFileName,final Path thePathOutputFileName,
    final Charset theInputCharset, final Charset theOutputCharset,
    final String theLineSeparator
    ) {
    try (
    final FSDataInputStream in = this.fileSystem.open(thePathInputFileName);
    final FSDataOutputStream out = this.fileSystem.create(thePathOutputFileName);
    final BufferedReader reader = new BufferedReader(new InputStreamReader(in, theInputCharset));
    final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, theOutputCharset));) {

    String line;
    while ((line = reader.readLine()) != null) {
    writer.write(line);
    writer.write(theLineSeparator);
    }

    } catch (IllegalArgumentException | IOException e) {
    LOGGER.error(e, "Exception on file '%s'", theOutputFileName);
    }
    }
    停止研究!
    ;-)

    关于java - HDFS文件编码转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64229496/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com