4.1 Hive参数 4.1.1 hive当中的参数、变量,都是以命名空间开头
通过${}方式进行引用,其中system、env下的变量必须以前缀开头。 4.1.2 hive 参数设置方式 1、修改配置文件 ${HIVE_HOME}/conf/hive-site.xml 2、启动hive cli时,通过–hiveconf key=value的方式进行设置 例:hive --hiveconf hive.cli.print.header=true 3、进入cli之后,通过使用set命令设置 注意:2和3两种方式设置的参数只在当前会话有效。 4.1.3 hive set命令 在hive CLI控制台可以通过set对hive中的参数进行查询、设置 set设置: set hive.cli.print.header=true; set查看 set hive.cli.print.header;查看该参数的值 set;查看hive的所有参数。 hive历史操作命令集 ~/.hivehistory
hive参数初始化配置 当前用户家目录下的.hiverc文件 如: ~/.hiverc 如果没有,可直接创建该文件,将需要设置的参数写到该文件中,hive启动运行时,会加载改文件中的配置。 [root@node4 ~]#vim .hiverc set hive.cli.print.header=true; [root@node4 ~]#hive hive>
4.2 hive 动态分区 开启支持动态分区 set hive.exec.dynamic.partition=true; 默认:true set hive.exec.dynamic.partition.mode=nostrict; 默认:strict严格模式(比如订单表以秒为单位创建分区,将会导致特别多的分区,严格模式一般不允许,但是非严格模式允许)。 nostrict:非严格模式 案例演示: 创建原始数据表 create table person21( id int, name string, age int, gender string, likes array, address map<string,string> ) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’; load data local inpath ‘/root/data/person21.txt’ into table person21;
create table person22( id int, name string, likes array, address map<string,string> ) partitioned by(age int,gender string) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’;
加载数据 from person21 insert overwrite table person22 partition(age, gender) select id, name,likes, address,age, gender distribute by age, gender; 或简写为: from person21 insert overwrite table person22 partition(age, gender) select id, name,likes, address,age, gender; 注意:分区字段一定要写到最后面,否则容易出错。 show partitions person22;#查询某表上的 分区 相关参数 set hive.exec.max.dynamic.partitions.pernode; 每一个执行mr节点上,允许创建的动态分区的最大数量(100) set hive.exec.max.dynamic.partitions; 所有执行mr节点上,允许创建的所有动态分区的最大数量(1000) set hive.exec.max.created.files; 所有的mr job允许创建的文件的最大数量(100000)
5 Hive分桶 5.1 hive 分桶概述 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。 对于hive中每一个表、分区都可以进一步进行分桶。 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。 适用场景: 对比MR的HashPartition 数据抽样( sampling )
5.2 开启支持分桶 set hive.enforce.bucketing=true; 默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用) 注意:一次作业产生的桶(文件数量)和reduce task个数一致。 5.3 分桶操作 5.3.1 往分桶表中加载数据 insert into table bucket_table select columns from tbl; insert overwrite table bucket_table select columns from tbl; 5.3.2 桶表 抽样查询 select * from bucket_table tablesample(bucket 1 out of 4 on columns); TABLESAMPLE语法: TABLESAMPLE(BUCKET x OUT OF y) x:表示从哪个bucket开始抽取数据 y:必须为该表总bucket数的倍数或因子
当表总bucket数为32时
- TABLESAMPLE(BUCKET 3 OUT OF 16),抽取哪些数据?
共抽取2(32/16)个bucket的数据,抽取第3、第19(16+3)个bucket的数据 - TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些数据?
共抽取4(32/8)个bucket的数据,抽取:3,11,19,27 - TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些数据?
共抽取1/8(32/256)个bucket的数据,抽取第3个bucket的1/8数据 5.4 实操案例 例: CREATE TABLE psn31( id INT, name STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’; 测试数据: [root@node4 ~]# vim bucket 1,tom,11 2,cat,22 3,dog,33 4,hive,44 5,hbase,55 6,mr,66 7,alice,77 8,scala,88 加载原始数据: hive> load data local inpath ‘/root/bucket’ into table psn31; 创建分桶表 CREATE TABLE psnbucket( id INT, name STRING, age INT) CLUSTERED BY (age) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
desc formatted psnbucket; 莫忘记开始分桶支持: set hive.enforce.bucketing=true; 从源数据表向分桶表中添加数据: insert into table psnbucket select id, name, age from psn31; 抽样 hive> select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age); OK id name age 3 dog 33 7 alice 77 [root@node4 ~]# hdfs dfs -cat /user/hive_remote/warehouse/psnbucket/000001_0 7,alice,77 3,dog,33
总结:分区是分目录存储,分桶是将表中的数据分文件存储。
|