如果我们已经有一些数据,请更新分区的配置单元表

时间:2017-03-05 02:08:15

标签: hadoop hive

我有一个按日分区的hive表,并且将与03-02-2017相关的数据加载到其中,但是,第二天我有与03-03-2017相关的数据。现在如何使用我的新数据更新hive表,以便我的hive仓库目录看起来像这样

hive/warehouse/sample_database/sample_table/day=03-02-2017/data_part_0000
hive/warehouse/sample_database/sample_table/day=03-03-2017/data_part_0000

因此,请向我提供创建表格的代码,以及在新数据集添加到此时如何更新表格。

2 个答案:

答案 0 :(得分:0)

首先,请记住Hive表指向HDFS中的某个位置,因此我不确定您对Hive数据仓库的意义。

要创建表,您必须按天(String)创建分区表,如:

CREATE EXTERNAL TABLE myTable
partitioned by (day STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.url'='/path/to/my/avro/schema/avro_schema.avsc')
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION '/hive/warehouse/sample_database/sample_table';

在上面的解决方案中,我假设你正在使用avro数据。实际上重要的部分是:partitioned by (day STRING)。在这里,您告诉Hive,此表将按日分区。

当新数据集出现在目录结构(hive/warehouse/sample_database/sample_table/day=03-03-2017/data_part_0000)中并且未由insert hive statement添加时,您将必须运行此命令:

msck repair table myTable;

这样,新分区将添加到表的Metastore中。请注意,您还有另一种选择:

alter table myTable add partition (day = '03-03-2017');

答案 1 :(得分:0)

以下是一个完整的演示,介绍了两个基本选项:

  1. 向表中添加分区。 HDFS目录将自动创建。
  2. 将目录添加到HDFS并在表格上应用 msck repair 以添加分区。
  3. 请注意,我使用DATE类型作为分区 日期文字的ANSI / ISO表示法是日期' YYYY-MM-DD'

    即使对于不支持DATE类型的旧版本,我强烈建议避免使用YYYY-MM-DD以外的任何日期格式,原因有以下几点:
    1.这是日期功能支持的唯一格式 这种格式允许正确的字母比较,例如, -
       ' 2017年1月22日' > ' 2016年9月22日'但是' 01-22-2017' < ' 2016年9月22日'

    演示

    <强>的bash

    hdfs dfs -mkdir -p /hive/warehouse/sample_database/sample_table
    

    <强>蜂房

    create external table sample_table
    (
        i int
    )
    partitioned by (day date)
    location '/hive/warehouse/sample_database/sample_table'
    ;
    

    选项1 - 更改表...添加分区...

    <强>蜂房

    alter table sample_table add partition (day=date '2017-03-02');
    alter table sample_table add partition (day=date '2017-03-03');
    
    hive> show partitions sample_table;
    OK
    day=2017-03-02
    day=2017-03-03
    Time taken: 0.067 seconds, Fetched: 2 row(s)
    hive> dfs -ls /hive/warehouse/sample_database/sample_table;
    Found 2 items
    ... 2017-03-04 23:31 /hive/warehouse/sample_database/sample_table/day=2017-03-02
    ... 2017-03-04 23:31 /hive/warehouse/sample_database/sample_table/day=2017-03-03
    hive> 
    

    选项2 - hdfs dfs -mkdir ... + msck修复表...

    <强>的bash

    hdfs dfs -mkdir /hive/warehouse/sample_database/sample_table/day=2017-03-02
    hdfs dfs -mkdir /hive/warehouse/sample_database/sample_table/day=2017-03-03
    

    <强>蜂房

    msck repair
    
    hive> show partitions sample_table;
    OK
    Time taken: 0.187 seconds
    hive> msck repair table sample_table;
    OK
    Partitions not in metastore:    sample_table:day=2017-03-02 sample_table:day=2017-03-03
    Repair: Added partition to metastore sample_table:day=2017-03-02
    Repair: Added partition to metastore sample_table:day=2017-03-03
    Time taken: 0.143 seconds, Fetched: 3 row(s)
    hive> show partitions sample_table;
    OK
    day=2017-03-02
    day=2017-03-03
    Time taken: 0.076 seconds, Fetched: 2 row(s)
    hive> dfs -ls /hive/warehouse/sample_database/sample_table;
    Found 2 items
    ... 2017-03-04 23:31 /hive/warehouse/sample_database/sample_table/day=2017-03-02
    ... 2017-03-04 23:31 /hive/warehouse/sample_database/sample_table/day=2017-03-03
    hive>