Hadoop MapReduce - 如何创建动态分区

时间:2018-04-29 04:14:04

标签: java hadoop mapreduce hadoop-partitioning

如何使用java map reduce创建动态分区,就像sql一样,我们按国家/地区列分组。示例i具有基于国家/地区的数据集,需要根据国家/地区(分区)分隔记录。我们不能限制国家。因为每天都会得到新的国家数据。

1 个答案:

答案 0 :(得分:1)

您可以利用dynamic partitioning feature of Hive根据传入的数据自动填充分区。下面的示例演示了基于country信息自动分区原始数据。

创建原始数据文件(country1.csv),其中包含多个国家/地区的数据

1,USA
2,Canada
3,USA
4,Brazil
5,Brazil
6,USA
7,Canada

将此文件上传到HDFS中的某个位置

hadoop fs -mkdir /example_hive
hadoop fs -mkdir /example_hive/country
hadoop fs -put country1.csv /example_hive/country

在数据顶部创建一个未分区的Hive表

CREATE EXTERNAL TABLE country
(
id int, 
country string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 'hdfs:///example_hive/country';

验证是否正确创建了Hive表

hive (default)> select * from country;
1   USA
2   Canada
3   USA
4   Brazil
5   Brazil
6   USA
7   Canada

创建一个分区的Hive表,其中country作为分区

hive (default)> CREATE TABLE country_par
(
id int
)
PARTITIONED BY (country string);

启用动态分区

hive (default)> SET hive.exec.dynamic.partition = true;
hive (default)> SET hive.exec.dynamic.partition.mode = nonstrict;

填充分区表,Hive自动将数据放入正确的国家/地区分区

hive (default)> INSERT INTO TABLE country_par 
PARTITION(country)
SELECT id,country FROM country;

验证分区是否已创建并正确填充

hive (default)> show partitions country_par;
country=Brazil
country=Canada
country=USA

hive (default)> select * from country_par where country='Brazil';
4   Brazil
5   Brazil

hive (default)> select * from country_par where country='USA';
1   USA
3   USA
6   USA

hive (default)> select * from country_par where country='Canada';
2   Canada
7   Canada

hive (default)> select country,count(*) from country_par group by country;
Brazil  2
Canada  2
USA 3