将.avro文件中的数据导入hive表

问题描述 投票:1回答:4

我通过以下命令和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
4个回答
2
投票

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

例如

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/有=2016/没=02/的=03/还=03/呵呵=12/data.AVR O /location/data/有=2016/没=02/的=03/还=03/呵呵=13/data2.AVR O

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

msck repair table table_name;

如果您不想这样做,可以使用添加分区

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)

1
投票

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

更新:

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

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

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

  • day = 2017-11-05

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


1
投票

以下语法将有所帮助。

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'

0
投票

您可以使用avro架构在avive中安装avro数据:

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;
© www.soinside.com 2019 - 2024. All rights reserved.