分区表
创建分区表
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);
分区表的目录结构
没有分区的目录结构:
hdfs://bigdata02:/user/hive/warehouse/db01.db/employees
分区后的目录结构:
hdfs://bigdata02:/user/hive/warehouse/db01.db/employees/country=CH/state=JS
hdfs://bigdata02:/user/hive/warehouse/db01.db/employees/country=AM/state=NY
分区表的优势
当我们需要查询中国江苏的雇员的信息的时候,我们就只需要列出一个目录下的数据就可以了,而不是扫描整个数据进行mapreduce处理,查询数据自然会快很多
分区表的劣势
我们知道对于分区表的每一个分区,都会启动一个map去读取数据,如果分区过于小的话,当我们对整个数据进行操作的时候,就会启动一个巨大的MapReduce任务,而每一个任务可能只是完成很少的一部分数据量的计算,所以我们对分区的划分需要有个度
分区表的信息的查询
hive> SHOW PARTITIONS employees;
...
Country=CA/state=AB
country=CA/state=BC
...
SHOW PARTITIONS employees PARTITI〇N(country=,US,);
SHOW PARTITIONS employees PARTITION(country='US', state='AK');
向分区表添加数据
LOAD DATA LOCAL INPATH '/home/hadoop/js.employee'
INTO TABLE employees PARTITION (country = 'CH', state = 'JS');
外部表和分区表的结合
优势:外部表可以随意指定分区的位置,我们就可以直接为分区表添加分区就可以了
alter table employee add partition (country='CH',state='JS') location 'hdfs://bigdata02:9000/employee/js';