hive常用语句

1.导入有分区的数据:oracle语句
select * from xx partition("FMLG_PART_${dateStr:0:6}")  where  \$CONDITIONS "


2.增量导入关系型数据库orcle的where语句表达式
select * from xx WHERE D_UPDATE >= to_date('20170423','yyyymmdd')  --to_date('${dateStr}','yyyymmdd')
and D_UPDATE < to_date('20170423','yyyymmdd') + 1--to_date('${dateStr}','yyyymmdd')+1


3.增量更新:先删除主表中已经存在跟从表主键一样的数据,然后把从表的数据插入主表)
#排除跟B表有一样主键的数据
hive -v -e "set mapred.job.queue.name=${queueName};
INSERT OVERWRITE TABLE ${safeName}.${tableName} \
SELECT A.*  \
FROM ${safeName}.${tableName} A  LEFT OUTER JOIN 
(select * from ${safeName}.${tableName}_delta where y='${dateStr:0:4}' AND m='${dateStr:4:2}' AND d='${dateStr:6:2}') B \
ON A.EXT_ID_TYPE = B.EXT_ID_TYPE \
AND A.EXT_ID = B.EXT_ID \
AND A.MEM_NUM = B.MEM_NUM
where B.CREATETIME IS NULL;";
exitCodeCheck $?


hive -v -e "set mapred.job.queue.name=${queueName}; \
INSERT INTO TABLE ${safeName}.${tableName} \
SELECT T.EXT_ID_TYPE,T.EXT_ID,T.CREATETIME,T.MEM_NUM    \
      FROM ${safeName}.${tableName}_delta T \
WHERE (y='${dateStr:0:4}' AND m='${dateStr:4:2}' AND d='${dateStr:6:2}' ";
exitCodeCheck $?
exitCodeCheck $?


4.distcp语句
hadoop distcp -Dmapred.job.queue.name=queue_4901_01 -m 90 -strategy dynamic -update -skipcrccheck hftp://xx:50070/user/hive/warehouse/g.db/wt/ hdfs://xx/user/hive/warehouse/g.db/wt/


5.查询关系型数据库列表(测试connect是否通)
sqoop list-tables --connect jdbc:oracle:thin:@xx:1534:claim --username xx --password xx


6.把空字符串转为使用is null查询到的值(serde序列反序列):
ALTER TABLE mdm_cdmdata_ods_bank_pms_card_info_tmp SET SERDEPROPERTIES('serialization.null.format' = '');
hive创建表的时候使用默认的serde:


1.、当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以二进制序列的形式在网络上传送。发送方需要把对象转化为字节序列才可在网络上传输,称为对象序列化;
接收方则需要把字节序列恢复为对象,称为对象的反序列化。
2、Hive的反序列化是对key/value反序列化成hive table的每个列的值。
3、Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。


新创建一个hive表,默认的NULL值是\N,传统的数据库中没有值或者为空即为NULL,hive中会吧\N解析成is null的结果值,若修改解析空值的解析为'',语句如下:
alter table name SET SERDEPROPERTIES('serialization.null.format' = ''); 修改为以上,插入空值的时候会插入默认的'',然后解析成Null值;
若值出现abc,或解析成NULL值:
alter table name SET SERDEPROPERTIES('serialization.null.format' = 'abc'); 


7.使用开发的UDF转换日期格式
add jar hdfs://xx/apps/user/jar/dutils.jar;
create temporary function gbd_format_telno as  'com.paic.hive.ql.udf2.phone.PAChinaCellPhoneUDF';
create temporary function gbd_format_date as  'com.paic.hive.ql.udf2.date.AutoFormatDateStrUDF';
create temporary function gbd_add_months as  'com.paic.hive.ql.udf2.date.AddMonthsUDF';


8.查看一个函数的使用方法:
desc function extended maskhash;


9.加载jar方法
(1)在hive里面执行add jar path/test.jar 
缺点:该方法的缺点是每次启动Hive的时候都要重新加入,退出Hive就会失败。


(2)在hive-site.xml文件设置
 
     hive.aux.jars.path  
     file:///jarpath/all_new1.jar,file:///jarpath/all_new2.jar  
 


(3)在${HIVE_HOME}目录下创建文件夹auxlib,然后将自定义jar文件放入改文件夹中。


10.Union和union all区别:
Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All,对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。


11.修改hive表的hdfs路径:

alter table test set location 'hdfs://xx/user/hive/warehouse/e.db/test1';


12.给已经创建的表字段添加注释:
alter table tablename change year year string comment "统计年份";


13.若需要控制hive cli登陆个数,在bin/hive中添加以下脚本:
cliNum=`ps -ef|grep org.apache.hadoop.util.RunJar|wc -l`
echo "$(id -nu)" >> /tmp/cliNum.log
echo $cliNum >> /tmp/cliNum.log
if [ $cliNum -gt 60 ];then
        echo ":";
        echo "";
        exit 1;
fi


14.把文本文件导入有分区的表
先添加分区
hive -e "set mapred.job.queue.name=queue_4901_01;use gbd_zq;load data local inpath 'TMP_GBD_FISL_FI_COST.csv' overwrite into  table TMP_GBD_FISL_FI_COST partition(dt='20170704');"


15.若字段为string类型而且为unix时间戳格式,需要转换:
from_unixtime(cast(${columns} as bigint),'yyyyMMdd') 
用法:from_unixtime(bigint,string)






你可能感兴趣的:(hive)