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

时间:2017-01-25 11:20:58

标签: apache hadoop hive avro

我通过以下命令和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 我根据分区有多个目录,因为那是我的分区列。

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

我尝试使用外部表,但它提供了例外。

4 个答案:

答案 0 :(得分: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/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;

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

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 :(得分:1)

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

更新:

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

  • 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上的不同文件夹中。您需要对数据写入权限才能创建分区。但是,如果您已经有分区,只需检查文件夹系统是否具有以下格式命名的每个文件夹:&#34; day = 2017-11-02&#34;。这样,当您运行MSCK REPAIR命令时,分区将自动作为元数据加载。我总是使用外部表,我完美地使用了这条管道。

答案 2 :(得分: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'

答案 3 :(得分:0)

您可以使用avro模式将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;