我遇到使用Avro数据/架构创建Hive外部表的问题:
遵循的步骤:
从HIVE命令行查询表时,收到错误:
java.io.IOException: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 /数据文件提供了所有必要的RWX权限。
任何指针?
答案 0 :(得分:3)
我已经解决了这个问题几天了....最后,发现,我将AVSC文件存储在与AVRO文件相同的目录中。出于某种原因,这导致了这个问题。然后,修复将是:
$ 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_avro_table;
CREATE EXTERNAL TABLE external_avro_table 行格式SERDE' org.apache.hadoop.hive.serde2.avro.AvroSerDe' 存储为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文件混合使用其他任何内容。 Hive会尝试将文件位置中的任何内容称为avro格式。
希望这有帮助。
答案 1 :(得分:0)
您使用的是从sqoop导入数据的文件夹吗?
如果是,则所有mapreduce作业sqoop也会在输出文件夹中创建_SUCCESS文件,该文件未由Avroserde识别。因此,从您在hive创建查询中指向的文件夹中删除_SUCCESS文件,然后选择查询将正常工作。