配置单元查询失败,给异常异常输入流结束

时间:2018-08-17 09:14:51

标签: java hadoop hive character-encoding urlencode

尝试从配置单元中HDFS中存在的.gz日志文件构建外部配置单元表。 运行查询后:

CREATE EXTERNAL TABLE table_name(att1 STRING,att3 STRING,att4 STRING,att5 STRING) row format serde "org.openx.data.jsonserde.JsonSerDe" with serdeproperties ("ignore.malformed.json"="true") STORED AS TEXTFILE LOCATION 'hdfs:////hdfs_location/';

我跑步时

   select count(*) from table_name;

通过给出以下堆栈跟踪失败:

  

TaskAttempt 2失败,信息= [错误:运行任务时出错(失败   ):   try_1534417036833_0016_1_00_000054_2:java.lang.RuntimeException:   org.apache.hadoop.hive.ql.metadata.HiveException:java.io.IOException:   java.io.EOFException:输入流的意外结束在   org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:211)     在   org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:168)     在   org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:370)     在   org.apache.tez.runtime.task.TaskRunner2Callable $ 1.run(TaskRunner2Callable.java:73)     在   org.apache.tez.runtime.task.TaskRunner2Callable $ 1.run(TaskRunner2Callable.java:61)     在java.security.AccessController.doPrivileged(本机方法)在   javax.security.auth.Subject.doAs(Subject.java:422)在   org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836)     在   org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61)     在   org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37)     在   org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)     在java.util.concurrent.FutureTask.run(FutureTask.java:266)在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)     在   java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)     在java.lang.Thread.run(Thread.java:748)造成原因:   org.apache.hadoop.hive.ql.metadata.HiveException:java.io.IOException:   java.io.EOFException:输入流的意外结束在   org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.pushRecord(MapRecordSource.java:74)     在   org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.run(MapRecordProcessor.java:419)     在   org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:185)     ...另外14个

我尝试通过验证json来查看内容。 运行红宝石脚本检查内容:

require "zlib"
require "json"

path = "/home/test_directory/file.gz"
infile = open(path)
gz = Zlib::GzipReader.new(infile)

gz.each_line do |line_content|      
    begin
        JSON.parse(line_content)  
    rescue JSON::ParserError => e  
        p "json parsing exception" + " -- " + line_content.strip
    rescue Exception => ex
        puts "An error of type #{ex.class} happened, message is #{ex.message}"
    end 
end

它给了我文件中某些行的异常消息:

  

发生了Encoding :: InvalidByteSequenceError类型的错误,消息   是US-ASCII上的“ \ xC3”

尝试根据以下条件修改我的查询:https://community.hortonworks.com/articles/58548/processing-files-in-hive-using-native-non-utf8-cha.html 修改是在创建外部表之后添加以下行:

 ALTER TABLE table_name SET SERDEPROPERTIES ('serialization.encoding'='SJIS');

这确实可行。 附言:这不是某些在线论坛中讨论的空文件问题,因为我在hdfs中没有空白文件。

我该怎么办,似乎是一些字符编码问题,但无法解决。

0 个答案:

没有答案