Hive Avro外部表查询 - IOException:不是数据文件

时间:2016-09-11 11:50:26

标签: hive sqoop

我遇到使用Avro数据/架构创建Hive外部表的问题:

遵循的步骤:

  1. 从MySQL导入数据 - HDFS为AVRO。
  2. 将.avsc文件从本地转移到HDFS [打开文件和 架构如预期的那样精细]
  3. 已验证由于SQOOP导入,数据存在于HDFS中。
  4. 现在创建了一个外部表,指向第2步和第2步的模式 位置到第3步。
  5. Hive命令行指出OK,表已创建。 ShotTables显示 表并验证了从hue标记的文件位置都很好。
  6. 从HIVE命令行查询表时,收到错误:

      

    java.io.IOException:java.io.IOException:不是数据文件。

  7. 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权限。

    任何指针?

2 个答案:

答案 0 :(得分:3)

我已经解决了这个问题几天了....最后,发现,我将AVSC文件存储在与AVRO文件相同的目录中。出于某种原因,这导致了这个问题。然后,修复将是:

  1. 为avro和avsc文件创建不同的目录:
  2. $ hadoop fs -mkdir / user / hduser / idl

    $ hadoop fs -mkdir / user / hduser / data

    1. 将每个文件移动到其位置:
    2. $ hadoop fs -mv /user/hduser/avrofile.avsc / user / hduser / idl

      $ hadoop fs -mv /user/hduser/avrofile.avro / user / hduser / data

      1. 重新创建表格
      2. 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文件,然后选择查询将正常工作。