我有一个按日分区的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
因此,请向我提供创建表格的代码,以及在新数据集添加到此时如何更新表格。
答案 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)
以下是一个完整的演示,介绍了两个基本选项:
请注意,我使用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'
;
<强>蜂房强>
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>
<强>的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>