赞
踩
第一种方式:load data local inpath
注意点:
1.必须是本地文件,不能是集群上的文件
2.文件路径中的变量如果无法替换,可以把单引号换成双引号,一般双引号总是没问题的
3.hive库在配置的时候有一个hdfs基础路径,用这种方式创建的表时可以不指定hdfs路径,导入数据后会自然在“hdfs基础路径/表名/”下生成相应的分区文件夹
4.用desc formatted table_name;可以查看hdfs路径
# 加载数据的脚本如下
- #!/bin/sh
- if [[ $# -eq 1 ]];then
- dt="${1}"
- else
- echo "无输入时间,请传入一个时间参数给程序"
- exit 1
- fi
-
- queryengine --sessionconf engine=wing -e"
- SET mapred.job.priority=VERY_HIGH;
- SET hive.merge.mapredfiles=true;
- SET hive.merge.size.per.task=536870912;
- SET hive.merge.smallfiles.avgsize=536870912;
- SET mapred.job.name=log_day_'${dt}';
- ADD FILE '/home/work/local/log_pretty/${dt}.log';
- load data local inpath '${dt}.log' overwrite INTO
- TABLE default.log_day PARTITION (pdate = '${dt}');
- ;"
-
- if [[ $? -eq 0 ]];then
- echo "数据入库正常........."
- exit 0
- else
- echo "数据入库出现异常.........."
- exit 1
- fi
# 创建表的语句如下
- USE default;
- CREATE TABLE log_day (
- req_date STRING COMMENT '请求日期',
- req_time STRING COMMENT '请求时间',
- user_id BIGINT COMMENT '用户id',
- url STRING COMMENT 'url',
- module STRING COMMENT '模块名',
- operation STRING COMMENT '操作名',
- task_id BIGINT COMMENT '任务id'
- )
- COMMENT '清洗后的日志'
- PARTITIONED BY(pdate STRING)
- ROW FORMAT CHARSET 'UTF8'
- DELIMITED FIELDS TERMINATED BY '\001'
- LINES TERMINATED BY '\n'
- STORED AS TEXTFILE ;
第二种方式:创建外部表然后增加分区
注意点:
1. location的全路径是创建表时的hdfs路径加上location中指定的分区文件夹
2. 删除分区时不会删除hdfs数据
# 增加分区的脚本如下
- hour_interval=-1
- startday=`date "+%Y%m%d"`
- tmp_time=`date -d "$startday $hour_interval days" "+%Y%m%d%H"`
- cur_date=${tmp_time:0:8}
- cur_hour=${tmp_time:8:2}
-
- while [ 1 ]
- do
- hive -e "use default; ALTER TABLE detail_report ADD IF NOT EXISTS PARTITION (dt = $cur_date, hour = $cur_hour) location '$cur_date/$cur_hour';"
- tmp_time=`date -d "$cur_date $cur_hour +1 hours" "+%Y%m%d%H"`
- cur_date=${tmp_time:0:8}
- cur_hour=${tmp_time:8:2}
-
- tmp_time1=`date -d "+2 hours" "+%Y%m%d%H"`
- cur_date1=${tmp_time1:0:8}
- cur_hour1=${tmp_time1:8:2}
- if [ $cur_date1 -eq $cur_date -a $cur_hour1 -eq $cur_hour ]
- then
- sleep 3600
- fi
- done
# 创建表的脚本如下
- use default;
- create EXTERNAL table
- IF NOT EXISTS hive_table_name (
- ac string comment '',
- res_type string comment '',
- install_date string comment '',
- install_time string comment '',
- ip string comment '',
- uid string comment ''
- )
- COMMENT ''
- PARTITIONED BY(day STRING, hour STRING)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY ','
- LOCATION 'hdfs://xx/xx/xx/hive_table_name';
hive常用语句
查看分区 show partitions table_name;
查看表详情 desc formatted table_name;
查看建表语句 show create table table_name;
删除分区 ALTER TABLE hive_cfp_install_report DROP IF EXISTS PARTITION (day='20181003');
下面提供一个批量删除分区的方式
- # 循环删除分区
- #!/bin/sh
- source /etc/profile
- startdate=`date -d $1 +"%Y%m%d"`
- tempdate=${startdate}
- enddate=`date -d $2 +"%Y%m%d"`
-
- # 将时间戳转成整数比大小
- while [ $((tempdate)) -le $((enddate)) ]
- do
- echo $tempdate "start####" # 20180801
-
- hive -e"
- use default;
- ALTER TABLE hive_report DROP IF EXISTS PARTITION (day='$tempdate');"
- tempdate=`date -d "1 day $tempdate" +"%Y%m%d"` # 20180802
- done
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。