尝试从配置单元中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中没有空白文件。
我该怎么办,似乎是一些字符编码问题,但无法解决。