从 .avro 文件导入数据到配置单元 table
Import data from .avro files to hive table
我按照我拥有的命令和 avro 架构创建了一个配置单元 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.avsc');
现在我想转储我在 HDFS 中创建的数据 table。
我有一个 HDFS 位置,其中我的目录结构中的数据为 t/y/m/d/h/hh/data.avro
我根据分区有多个目录,因为那是我的分区列。
我想将所有数据转储到创建的table。
我尝试使用外部 table,但出现异常。
您可以在查询期间插入 LOCATION 'path_hdfs'
命令以创建外部 table,或者使用命令 LOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name;
使用物理 table。
更新:
根据 OP 的要求,我添加了有关分区的更多信息。在创建查询期间,您必须指定命令 PARTITIONED BY (day string)
(数据类型 'string' 的 'day' 变量的示例)。有关完整示例,请参阅 lake 提供的答案。然后,如果您的创建数据已经具有以下 '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 命令时,分区将作为元数据自动加载。我一直使用外部 tables,我完美地使用了这个管道。
如果您遵循 hdfs 文件夹中的配置单元约定并创建指向 table 位置的配置单元 table,您应该 运行 msck 修复 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;
如果你不想这样做,你可以使用像
这样的添加分区
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)
以下语法会有所帮助。
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 模式将 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;
我按照我拥有的命令和 avro 架构创建了一个配置单元 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.avsc');
现在我想转储我在 HDFS 中创建的数据 table。
我有一个 HDFS 位置,其中我的目录结构中的数据为 t/y/m/d/h/hh/data.avro 我根据分区有多个目录,因为那是我的分区列。
我想将所有数据转储到创建的table。
我尝试使用外部 table,但出现异常。
您可以在查询期间插入 LOCATION 'path_hdfs'
命令以创建外部 table,或者使用命令 LOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name;
使用物理 table。
更新:
根据 OP 的要求,我添加了有关分区的更多信息。在创建查询期间,您必须指定命令 PARTITIONED BY (day string)
(数据类型 'string' 的 'day' 变量的示例)。有关完整示例,请参阅 lake 提供的答案。然后,如果您的创建数据已经具有以下 '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 命令时,分区将作为元数据自动加载。我一直使用外部 tables,我完美地使用了这个管道。
如果您遵循 hdfs 文件夹中的配置单元约定并创建指向 table 位置的配置单元 table,您应该 运行 msck 修复 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;
如果你不想这样做,你可以使用像
这样的添加分区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)
以下语法会有所帮助。
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 模式将 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;