【问题标题】:Import data from .avro files to hive table将数据从 .avro 文件导入配置单元表
【发布时间】:2017-01-25 11:20:57
【问题描述】:

我按照我拥有的命令和 avro 模式创建了一个 hive 表。

CREATE TABLE table_name
PARTITIONED BY (t string, y string, m string, d string, h string, hh string)
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'
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema.avsc');

现在我想将我在 HDFS 中的数据转储到创建的表中。

我有一个 HDFS 位置,其中我的目录结构中的数据为 t/y/m/d/h/hh/data.avro 根据分区,我有多个目录,因为那是我的分区列。

我想将所有数据转储到创建的表中。

我尝试使用外部表,但它给出了异常。

【问题讨论】:

    标签: apache hadoop hive avro


    【解决方案1】:

    如果您遵循 hdfs 文件夹中的 hive 约定并创建指向表位置的 hive 表,则应运行 msck repair table 语句。

    例如

    CREATE TABLE table_name
    PARTITIONED BY (t string, y string, m string, d string, h string, hh string)
    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'
    TBLPROPERTIES (
    'avro.schema.url'='hdfs://location/schema/schema.avsc')
    location "hdfs:///location/data;
    

    并像这样加载数据

    /location/data/y=2016/m=02/d=03/h=03/hh=12/data.avro /location/data/y=2016/m=02/d=03/h=03/hh=13/data2.avro

    通过这种方式,您将能够使用以下语句加载数据,因为 Hive 将识别分区

    msck repair table table_name;
    

    如果你不想这样做,你可以使用 add partition like

    ALTER TABLE table_nameADD PARTITION (y='01',m='02',d='03',h='03',hh='12') location '/yourpath/y=2016/m=02/d=03/h=03/hh=12/'; (or any other folder)
    

    【讨论】:

      【解决方案2】:

      您可以在查询期间插入LOCATION 'path_hdfs' 命令以创建外部表,或使用命令LOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name; 使用物理表。

      更新:

      按照 OP 的要求,我添加了有关分区的更多信息。您必须在创建查询期间指定命令PARTITIONED BY (day string)(数据类型为“字符串”的“日”变量的示例)。有关完整示例,请参阅湖提供的答案。然后,如果您的创建数据已经具有以下“day”值:

      • 天 = 2017-11-02
      • 天 = 2017-11-03
      • 天 = 2017-11-04

      当您运行命令MSCK REPAIR TABLE <table> 时,将添加这三个值的分区。第二天,假设您收到 day = 2017-11-05 的数据,当您运行 MSCK REPAIR TABLE <table> 时,将为新值添加一个新分区:

      • 天 = 2017-11-05

      物理上,添加分区会将数据组织到 HDFS 上的不同文件夹中。您需要对数据的写入权限才能创建分区。但如果您已经有分区,只需检查文件夹系统是否将每个文件夹命名为以下格式:“day=2017-11-02”。这样,当您运行 MSCK REPAIR 命令时,分区将自动加载为元数据。我一直使用外部表,并且完美地使用了这个管道。

      【讨论】:

      • 我不能在创建外部表时使用 LOCATION 'path_hdfs',因为我没有磁盘写权限。
      • 当我使用 LOAD DATA 命令时,我收到以下异常,,, FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned....我怎么能指定分区?
      • 您必须在创建查询期间声明分区,然后在导入新数据(在分区端使用新值)后定期运行命令 MSCK REPAIR 更新分区。例如,如果您按天进行分区,那么您每天都必须运行命令 MSCK REPAIR 将新的日期添加到分区中。现在我用分区语法更新我的答案。
      【解决方案3】:

      下面的语法会很有帮助。

      CREATE EXTERNAL TABLE table_name
          PARTITIONED BY (part string)
          ROW FORMAT SERDE
          'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
          WITH SERDEPROPERTIES (
          'avro.schema.url'='hdfs:///path/to/avro/schema/')
          STORED AS INPUTFORMAT
          'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
          OUTPUTFORMAT
          'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
          LOCATION 'path/to/location'
      
          ALTER TABLE table_name ADD PARTITION (part='part_name') LOCATION 'location'
      

      【讨论】:

        【解决方案4】:

        您可以使用 avro 模式将 avro 数据挂载到 hive 中:

        CREATE TABLE dummy_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'
        TBLPROPERTIES (
        'avro.schema.url'='hdfs:///pathtoschema/schema.avsc');
        

        关于在 dummy_table 中加载数据的问题,您可以这样做:

        LOAD DATA INPATH 'hdfs:///pathtoinputdata/inputdata' OVERWRITE INTO TABLE dummy_table;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-22
          • 1970-01-01
          相关资源
          最近更新 更多