将.avro文件中的数据导入hive表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将.avro文件中的数据导入hive表相关的知识,希望对你有一定的参考价值。
我通过以下命令和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我根据分区有多个目录,因为这是我的分区列。
我想将所有数据转储到创建的表中。
我尝试使用外部表,但它提供了例外。
如果您遵循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)
您可以在查询期间插入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命令时,分区将自动作为元数据加载。我总是使用外部表,我完美地使用了这个管道。
以下语法将有所帮助。
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'
您可以使用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;
以上是关于将.avro文件中的数据导入hive表的主要内容,如果未能解决你的问题,请参考以下文章