从 .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;