hiveavro外部表查询-ioexception:不是数据文件

bqujaahr  于 2021-06-03  发布在  Sqoop
关注(0)|答案(2)|浏览(418)

我在使用avro数据/架构创建配置单元外部表时遇到问题:
接下来的步骤:
以avro的形式从mysql-hdfs导入数据。
将.avsc文件从本地传输到hdfs[打开该文件,架构如预期的那样良好]
验证了数据作为sqoop导入的结果存在于hdfs中。
现在创建了一个外部表,将架构指向步骤#2,将数据位置指向步骤#3。
hive命令行表示确定,表已创建。shottables显示该表,并验证来自hue的文件位置标记是否正常。
从配置单元命令行查询表时,出现错误:
java.io.io文件exception:java.io.ioexception:不是数据文件。 hive> create external table departmentsAvro2 row format serde 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' stored as inputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' location 'hdfs://quickstart.cloudera/user/cloudera/sqoopAvro' tblproperties ('avro.schema.url'='hdfs://quickstart.cloudera/user/cloudera/departments.avsc'); 输出:

OK
Time taken: 0.092 seconds
``` `hive> show tables;` 输出:

OK
departmentsavro2
order_items
orders
Time taken: 0.016 seconds, Fetched: 12 row(s)
``` hive> select * from departmentsavro2; 输出:

OK
Failed with exception java.io.IOException:java.io.IOException: Not a data file.
Time taken: 0.145 seconds

正如某些线程中所建议的那样,它为hdfs中的.avsc/data文件提供了所有必要的rwx权限。
有什么建议吗?

lf5gs5x2

lf5gs5x21#

我已经围绕这个问题工作了几天了。。。。最后,我发现,我将avsc文件存储在与avro文件相同的目录中。出于某种原因,这导致了这个问题。那么,解决方法是:
为avro和avsc文件创建不同的目录:
$ hadoop fs -mkdir /user/hduser/idl $ hadoop fs -mkdir /user/hduser/data 将每个文件移到其位置:
$ hadoop fs -mv /user/hduser/avrofile.avsc /user/hduser/idl $ hadoop fs -mv /user/hduser/avrofile.avro /user/hduser/data 重新创建表
drop table external\ U avro\ U表格;

CREATE EXTERNAL TABLE external_avro_table
 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
 STORED AS INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
 OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
 LOCATION 'hdfs://namenode:54310/user/hduser/data'
 TBLPROPERTIES ('avro.schema.url'='hdfs://namenode:54310/user/hduser/idl/avrofile.avsc');

4不要把任何东西和你的avro文件混在一起。配置单元将尝试将文件位置中的任何内容引用为具有avro格式。
希望这有帮助。

wtlkbnrh

wtlkbnrh2#

您使用的是从sqoop导入数据的文件夹吗?
如果是,因为所有mapreduce作业sqoop也会在输出文件夹中创建一个未被avroserde标识的\u success文件。因此,从hivecreate查询中指向的文件夹中删除\u success文件,然后select查询就可以正常工作了。

相关问题