我在使用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权限。
有什么建议吗?
2条答案
按热度按时间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表格;
4不要把任何东西和你的avro文件混在一起。配置单元将尝试将文件位置中的任何内容引用为具有avro格式。
希望这有帮助。
wtlkbnrh2#
您使用的是从sqoop导入数据的文件夹吗?
如果是,因为所有mapreduce作业sqoop也会在输出文件夹中创建一个未被avroserde标识的\u success文件。因此,从hivecreate查询中指向的文件夹中删除\u success文件,然后select查询就可以正常工作了。