java - Hive 查询失败,异常意外结束输入流
问题描述
尝试从 hive 中 HDFS 中存在的 .gz 日志文件构建外部 hive 表。运行查询后:
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 失败,info=[错误:运行任务时出错(失败):尝试_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.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(Native Method) 在 javax.security.auth.Subject。doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61) at org .apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37) at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) at 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 来查看内容。运行一个 ruby 脚本来检查内容:
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');
它起作用了。PS:这不是一些在线论坛中讨论的空文件问题,因为我在 hdfs 中没有空白文件。
我能做些什么,它似乎是一些字符编码问题,但无法获得解决方案。
解决方案
推荐阅读
- dust.js - 同时访问嵌套数组中的外部和内部索引
- c# - 比较两个数据表的值,如果不同,则添加到新数据表以进行添加、更新和删除
- java - 新场景启动后代码如何执行
- angular - 如何从目录访问打字稿中的文件名
- reactjs - 使用带有反应生命周期方法的 react-apollo 2.1 突变
- javascript - 解析 EntityName XMLHttpRequest 请求时出错
- c++ - free():多次调用后下一个大小无效(快速)
- java - 添加 freemarker 模板后缀时,Hystrix Dashboard 未出现
- javascript - 如何从此代码中删除 jQuery?
- python - python请求发送None而不是null