create table hn_diff_result (
hn_id string,
source_id string,
address string,
address_normal string,
format_address string,
longitude DOUBLE,
latitude DOUBLE,
prov_name string,
city_name string,
ad_name string,
prov_code string,
city_code string,
ad_code string,
version string,
source string,
delta_type string,
bak_field1 string,
bak_field2 string,
bak_field3 string
)
partitioned by (dt string);
https://www.jianshu.com/p/be5fef204cd1
https://blog.csdn.net/shudaqi2010/article/details/90288901
Hive分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹
1、首先,创建分区表的时候,要通过关键字 partitioned by (name string)声明该表是分区表,
并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。
create table emp(name string, age int) partitioned by (provice string,city string);
2、其次,向分区表导入数据的时候,要通过关键字partition(name=“jack”)显示声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区。
insert into emp partition(provice = "hebei", city = "baoding") values("tom",22);
dfs -ls -R /user/warehouse/;
/user/hive/warehouse/base1.db/emp/provice=hebei
/user/hive/warehouse/base1.db/emp/provice=hebei/city=baoding
/user/hive/warehouse/base1.db/emp/provice=hebei/city=baoding/000000_0
hive>load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice = "hebei",city = "baoding");
hive>load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice = "hebei",city = "handan");
hive>show partitions database1.table;
OK
provice=hebei/city=baoding
provice=hebei/city=handan
hive>alter table emp add partition(provice = "hebei", city = "shijiazhuang");
hive>show partitions emp;
OK
provice=hebei/city=baoding
provice=hebei/city=handan
provice=hebei/city=shijiazhuang
hive>insert into partition(provice = 'hebei', city = 'shijiazhuang') values('tomslee',26);
hive>alter table managed_t drop partition (add = 'beijing');
3、再次,这里要重点强调,所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区。
动态分区
假设在HDFS上已经存在一个宽表(例如,职员表,这个表的字段非常多,并且数据量也很大),我们想要根据国家和省份把这些数据放到不同的分区中,使用动态分区是十分合适的。
hive>create table emp(name string,age int)
hive>partitioned by (country string,state string)
hive>row format delimited
hive>fields terminated by '\t'
hive>lines terminated by '\n'
hive>stored as textfile;
这里country state 没有指定值
hive>insert into table emp partition(country,state) select name,age,country,state from t1;
半动态分区表
hive>insert into table emp partition(country = 'US',state)
hive>select name,age,country,state from t1;
网友评论