hive的基本详细内容

#HIVE操作
#建表
#数据类型
#数据类型 java mysql hive
#字符串 String char(n)/varchar(n)/text/… string/char(255)/varchar(65536)
#字符串 char
#整数 byte/short/int/long smallint/int(n)/bigint(n) smallint/int/bigint
#小数 float/double/BigDecial float/double/money/real float/double
numeric(m,n)/decimal(m,n) decimal(38,18)
#布尔 boolean bit boolean
#日期 java.util.Date date/datetime/timestamp date/timestamp
#列表 HashSet set(‘V1’,‘V2’,‘V3’,…) array<data_type>
#结构体 struct<col_name:data_type,…>
#键值 map<key_type,value_type>
#符合类型 uniontype<data_type,…>
#函数
desc function extended FUNC_NAME;
https://www.cnblogs.com/demonoliu/p/7725425.html
#数学函数
1、log(double base, double a) #以base为底的a的对数
2、pow(double a, double p) #计算a的p次幂
3、conv(bigint/string num, #将bigint/string类型的num从from_base进制转换成to_base进制
int from_base, int to_base) conv(21,10,2)—10101(把21从十进制转化为2进制)
4、pmod(int/double a, int/double b)#a对b取余
5、hex(string a) unhex(string a) #求一个字符串a的正反16进制转化 hex(‘abc’)—616263类似于简单的加密
6、[a]sin(double/decimal a) #求a的正反正弦值
7、[a]cos(double/decimal a) #求正反余弦值
8、[a]tan(double/decimal a) #求正反正切值
9、degrees(double/decimal a) #将弧度值转换角度值
10、radians(double/decimal a) #将角度值转换成弧度值
11、positive(int/double a) #返回a
12、negative(int/double a) #返回a的相反数
13、sign(double/decimal a) #如果a是正数则返回1.0,是负数则返回-1.0,否则返回0.0
14、e()/pi() #数学常数e/pi
15、greatest(T v1, T v2, …) #求最大值
16、least(T v1, T v2, …) #求最小值

		17、bround(double a,int d)			#double 财务舍入法
		18、factorial(int a)				#求a 20以内的阶乘
		19、shiftleft(int a, int b)			#按位左移
		20、shiftright(int a, int b)		#按位右移

	 
	#集合函数
	 
		1、int 		size(Map<K.V>)		#求map的长度 比如select map_keys(Map(1.3,3.4);结果为2
		2、int			size(Array<T>)		#求数组的长度
		3、array<K>	map_keys(Map<K.V>)	#返回map中的所有key   
		4、array<V>	map_values(Map<K.V>)#返回map中的所有value
		5、array<T>	sort_array(Array<T>)#按自然顺序对数组进行排序并返回
		6、boolean		array_contains(Array<T>, value)#如该数组Array<T>包含value返回true,否则返回false
		array(T...)创建数组函数
		map((K,V)...)创建键值对函数
		struct(V。。。)创建结构体函数
		 
	#类型转换函数
	
		type cast(expr as <type>)#将expr转换成type类型 
			cast("1" as bigint) 将字符串1转换成了bigint类型,如果转换失败将返回NULL

	#日期函数
		1、string 		from_unixtime(bigint unixtime, string format)#将时间的秒值转换成format格式
					from_unixtime(1250111000,"yyyy-MM-dd") #得到2009-03-12
		2、string 		date_format(date/timestamp/string date,string format)
					date_format('2009-03-12','MM') 得到03
		
		3、string		current_date()
		4、string		to_date(string timestamp)#返回时间字符串的日期部分
		5、string		current_timestamp()当前时间戳
		
		6、bigint 		unix_timestamp()#获取本地时区下的时间戳
		7、bigint 		unix_timestamp(string date)#将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳  如unix_timestamp('2009-03-20 11:30:01') = 1237573801
		8、bigint		unix_timestamp(string date, string format_pattern)#将指定时间字符串格式字符串转换成Unix时间戳,如果格式不对返回0 如:unix_timestamp('2009-03-20', 'yyyy-MM-dd') = 1237532400
		
		9、string		date_add(string date,int days)
		10、string		add_months(current_date(),±2);
		
		11、string		next_day(current_date(),'Mo/Tu/WE/Th/Fr/Sa/Su');#日期之后的下一个Mo/Tu/WE/Th/Fr/Sa/Su
		12、string		last_day(current_date());#返天
		13、string		trunc(current_date(),'YY/MM');#返回日期的本年/本月的第一天
					#返回日期的本季度第一天
					concat_ws('-',cast(year(current_date()) as string),cast(ceil(month(current_date())/3)*3-2 as string),'01');
					#返回日期的本周的第一天
					date_add(next_day(current_date(),'SU'),-7);
					
		14、int			datediff(string enddate, string startdate)#计算开始时间startdate到结束时间enddate相差的天数
		15、double		months_between(string bigdate,string smalldate)#
					
		

	 
	#条件函数
	
	1、T		if(boolean Condition, T vTrue, T vFalse)			#如果testCondition 为true就返回valueTrue,否则返回valueFalseOrNull ,(valueTrue,valueFalseOrNull为泛型) 
	2、T		nvl(T value, T default_value)						#如果value值为NULL就返回default_value,否则返回value
	3、T		coalesce(T v1, T v2, ...)							#返回第一个非null的值,如果全部都为NULL就返回NULL  如:COALESCE (NULL,44,55)=44/strong>
	4、T		case a when b then c [when d then e]* [else f] end 	#如果a=b就返回c,a=d就返回e,否则返回f  如CASE 4 WHEN 5  THEN 5 WHEN 4 THEN 4 ELSE 3 END 将返回4
	5、T		case when a then b [when c then d]* [else e] end 	#如果a=ture就返回b,c= ture就返回d,否则返回e  如:CASE WHEN  5>0  THEN 5 WHEN 4>0 THEN 4 ELSE 0 END 将返回5;CASE WHEN  5<0  THEN 5 WHEN 4<0 THEN 4 ELSE 0 END 将返回0
	6、boolean	isnull( col/T )			#如果a为null就返回true,否则返回false
	7、boolean	isnotnull ( col/T)		#如果a为非null就返回true,否则返回false

	 
	 
	#字符函数
	 
	1、int		ascii(string str)#返回str中首个ASCII字符串的整数值
	
	2、string	concat(string|binary A, string|binary B...)#对二进制字节码或字符串按次序进行拼接
	3、string	concat_ws(string SEP, string A, string B...)#与concat()类似,但使用指定的分隔符号进行分隔
	4、string	concat_ws(string SEP, array<string>)#拼接Array中的元素并用指定分隔符进行分隔
	格式化字符串 printf(string,T...)  '%s %d %.nf'
	5、array<array<string>> sentences(string sentence);#字符串str将被转换成单词数组,不同符号结果不一样[["hello","world"],["how","are","you"]]
	select sentences('hello world?how are you');----[["hello","world"],["how","are","you"]]
	select sentences('hello world!how are you');----[["hello","world"],["how","are","you"]] 
	select sentences('hello world,how are you');----[["hello","world","how","are","you"]]
	
	
	6、array<struct<string,double>>	ngrams(array<array<string>>, int N, int K)
	#按N个单词出现频次,倒序取TOP K 
	select ngrams(sentences('hello world?how are you'),1,2);
	词频,连续1个单词倒序以后前2位
	[{"ngram":["how"],"estfrequency":1.0},{"ngram":["you"],"estfrequency":1.0}]
	7、array<struct<string,double>>	context_ngrams(array<array<string>> arr,array<string>,int k)
	#与ngram类似,但context_ngram()允许你预算指定上下文(数组)来去查找子序列
	#与array中指定单词之后配合出现的频次,倒序取TOP K
	select context_ngrams(sentences('hello kb10?how are youhello world,are you ok?'),array('you',null),2);
	结果:[{"ngram":["ok"],"estfrequency":1.0}]
	
	
	
	8、string	decode(binary bin, string charset)
		#使用指定的字符集charset将二进制值bin解码成字符串,支持的字符集有:'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16',如果任意输入参数为NULL都将返回NULL
	9、binary	encode(string src, string charset)
		#使用指定的字符集charset将字符串编码成二进制值,支持的字符集有:'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16',如果任一输入参数为NULL都将返回NULL
		select encode('我爱中华001abc你们','UTF-16BE')
		select decode(encode('我爱中华001abc你们','UTF-16BE'),'UTF-16BE')
		
	10、string format_number(number x, int d)
		#将数值X转换成"#,###,###.##"格式字符串,并保留d位小数,如果d为0,将进行四舍五入且不保留小数
		select format_number(478493145631.2546,5);
		478,493,145,631.25460 
	
	11、string	get_json_object(string json_string, string path)
		#从指定路径上的JSON字符串抽取出JSON对象,并返回这个对象的JSON格式,如果输入的JSON是非法的将返回NULL,注意此路径上JSON字符串只能由数字 字母 下划线组成且不能有大写字母和特殊字符,且key不能由数字开头,这是由于Hive对列名的限制
		select get_json_object('{"name":"henry"}','$.name')--- henry 
		select get_json_object('{"name":"henry","info":{"city":"nj"}}','$.info.city');---nj
		select get_json_object('{"name":"henry","info":["city","nj"]}','$.info[0]');---city

	
	12、boolean	in_file(string line, string path)#path中指向的文件是否包含line

	
	13、string	parse_url(string urlString, string partToExtract [, string keyToExtract])
						(url元素提取)
	#返回从URL中抽取指定部分的内容,参数url是URL字符串,而参数partToExtract是要抽取的部分,
	这个参数包含(HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO,
	例如:parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') ='facebook.com',
	如果参数partToExtract值为QUERY则必须指定第三个参数key  
	如:parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1') =‘v1’

	14、string	printf(String format, T...t)#按照printf风格格式输出字符串
		select printf('%s,%d,%.2f','henry',18,23456.789);---henry,18,23456.79
		
		
	15、Boolean	like	# %
	16、Boolean	rlike	# [] {} ? + \d \w ...正则模糊函数
		
	17、string	regexp_replace(string src, string regex, string replacement)

	#按照Java正则表达式PATTERN将字符串src中符合条件的部分成replacement所指定的字符串,如里REPLACEMENT这空的话,抽符合正则的部分将被去掉  如:regexp_replace("foobar", "oo|ar", "") = 'fb.' 注意些预定义字符的使用,如第二个参数如果使用'\s'将被匹配到s,'\\s'才是匹配空格
	select regexp_replace('you me he y_ou young yuuuuuug','y\\w{2,3}','YOU');----YOU me he YOU YOUg YOUuuug
		 
	18、string	regexp_extract(string src, string regex, int index)

	抽取字符串subject中符合正则表达式pattern的第index个部分的子字符串,注意些预定义字符的使用,如第二个参数如果使用'\s'将被匹配到s,'\\s'才是匹配空格
		select regexp_extract('namehenryokdarlingduck','name(.*?)ok(.*?)duck',2);
	 
 
	19、array<string>	split(string str, string regex)

	按照正则表达式pat来分割字符串str,并将分割后的数组字符串的形式返回
	select split(regexp_replace('["henry","pola","ariel"]','\\[|\\]|"',''),',');---["henry","pola","ariel"] 
	select split('henry.chen@hotmail.com','\\.|@');----["henry","chen","hotmail","com"] 

	20、map<string,string>	str_to_map(string str,string spel1,string spel2)

	将字符串str按照指定分隔符转换成Map,第一个参数是需要转换字符串,第二个参数是键值对之间的分隔符,默认为逗号;第三个参数是键值之间的分隔符,默认为":"
	select str_to_map('name:henry,age:22,gender:male');
	select str_to_map('name#henry|age#22|gender#male','\\|','#');
	结果: {"name":"henry","gender":"male","age":"22"} 
	
	
	array/struct/map转类型
	

	21、string translate(string|char|varchar input, string|char|varchar from, string|char|varchar to)
		(字符替换函数)
	
	将input出现在from中的字符串替换成to中的字符串 如:translate("MOBIN","BIN","M")="MOM"
	select translate('abcabcabaac','ab','*#');----*#c*#c*#**c 
	
	22、initcap 首字母大写
	 


	23、string substr(string|binary A, int start) substring(string|binary A, int start)

	对于字符串A,从start位置开始截取字符串并返回
	
	24、string substr(string|binary A, int start, int len) substring(string|binary A, int start, int len)

	对于二进制/字符串A,从start位置开始截取长度为length的字符串并返回
		
		select substr('henry',2,3);---enr 
		select substr('henry',2);enry
		
	25、int	locate(string substr, string str[, int pos])#查找字符串str中的pos位置后字符串substr第一次出现的位置,pos从1开始
	select locate('en','henry',1);--2
	
	26、int	instr(string str, string substr)		#查找字符串str中子字符串substr出现的位置,如果查找失败将返回0,如果任一参数为Null将返回null,注意位置为从1开始的
	select instr('henry','en');--2
	
	md5单向加密
	base64
	select base64(cast('henry' as binary));---aGVucnk= 
	select unbase64('aGVucnk=');----henry
	hex/unhex
	binary	unbase64(string str)将64位的字符串转换二进制值
	sha2(string/binary,int(0/1));单向加密int选0或1
	select sha2('henry',1);--3eca10f30041813f045165784e24b5a950a6cc7e
	
	
	aes_encrype
	aes_decrype
	
	int	levenshtein(string A, string B)	Returns the Levenshtein distance between two strings (as of Hive 1.2.0). For example, levenshtein('kitten', 'sitting') results in 3..
	计算两个字符串之间的差异大小  如:levenshtein('kitten', 'sitting') = 3

	string	soundex(string A)	Returns soundex code of the string (as of Hive 1.2.0). For example, soundex('Miller') results in M460..
	将普通字符串转换成soundex字符串
	select soundex('bc');--B200

	string	initcap(string A)	Returns string, with the first letter of each word in uppercase, all other letters in lowercase. Words are delimited by whitespace. (As of Hive 1.1.0.).
	将字符串A转换第一个字母大写其余字母的字符串

		 
	 
	#聚合函数
	
	BIGINT	count(*), #统计总行数,包括含有NULL值的行
	int		count(expr), #统计提供非NULL的expr表达式值的行数
	BIGINT	count(DISTINCT expr[, expr...])#统计提供非NULL且去重后的expr表达式值的行数

	double	sum(col), sum(DISTINCT col)
			sum(col),表示求指定列的和,sum(DISTINCT col)#表示求去重后的列的和

	double	avg(col), #表示求指定列的平均值
			avg(DISTINCT col)#表示求去重后的列的平均值


	double	min(col)	#求指定列的最小值

	double	max(col)	#求指定列的最大值

	double	var_pop(col)	#求指定列数值的方差:离散程度

	double	var_samp(col)	#求指定列数值的样本方差:变异程度

	double	stddev_pop(col)	#求指定列数值的标准偏差

	double	stddev_samp(col)	#求指定列数值的样本标准偏差

	double	covar_pop(col1, col2)	#求指定列数值的协方差

	double	covar_samp(col1, col2)	#求指定列数值的样本协方差

	double	corr(col1, col2)	#返回两列数值的相关系数

	double percentile(BIGINT col, p)	#返回col的p%分位数
			collect_list(col)	#列转行 (不去重)
		
			collect_set(col)	#列转行 (去重)

	 
	 
	#表生成函数
	
	1、Array Type	explode(array<TYPE> a)#对于a中的每个元素,将生成一行且包含该元素

	2、N rows	explode(ARRAY<T>)	每行对应数组中的一个元素
	select name,city from employee_id lateral view explode(cities) ct as city;

	3、N rows explode(MAP<K,v>) 每行对应每个map键-值,其中一个字段是map的键,另一个字段是map的值
	select name,pos,score from employee_id lateral view explode(scores) st as pos,score;

	4、N rows	posexplode(ARRAY)#与explode类似,不同的是还返回各元素在数组中的位置
	select posexplode(array('aa','bb','cc'));
	
	5、N rows	stack(INT n, v_1, v_2, ..., v_k)#把M列转换成N行,每行有M/N个字段,其中n必须是个常数
	select stack(2,'aa','bb','cc','dd');

	6、tuple	json_tuple(jsonStr, k1, k2, ...)#从一个JSON字符串中获取多个键并作为一个元组返回,与get_json_object不同的是此函数能一次获取多个键值

	7、tuple	parse_url_tuple(url, p1, p2, ...)#返回从URL中抽取指定N部分的内容,参数url是URL字符串,而参数p1,p2,....是要抽取的部分,这个参数包含HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:<KEY>

	select printf('%s %s',fn,ln) name,age,hobby from jsontuple 
	lateral view json_tuple(line,'name','hobbies','age') jt as name,hobbies,age 
	lateral view json_tuple(name,'first','last') jt1 as fn,ln
	lateral view explode(split(regexp_replace(hobbies,'\\[|\\]|"',''),',')) hs as hobby;
	
	8、inline(ARRAY<STRUCT[,STRUCT]>)#将结构体数组提取出来并插入到表中
	select inline(array(struct('aa','bb','cc'),struct('ee','dd','ff')));

#----------------------------------------------------------------------------
#https://www.cnblogs.com/hyunbar/p/13524855.html
#窗口函数

	1.1 窗口函数
	FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
	LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值
	LEAD(col,n,DEFAULT) :用于统计窗口内往后第n行值。
	第一个参数为列名,
	第二个参数为往下第n行(可选,默认为1),
	第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
	LAG(col,n,DEFAULT) :用于统计窗口内往前第n行值。
	第一个参数为列名,
	第二个参数为往上第n行(可选,默认为1),
	第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
	1.2 OVER从句
	1、使用标准的聚合函数COUNT、SUM、MIN、MAX、AVG
	2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列
	3、使用PARTITION BY与ORDER BY语句,使用一个或者多个数据类型的分区或者排序列
	4、使用窗口规范,窗口规范支持以下格式:

	(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
	(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
	(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING
	5、当ORDER BY后面缺少窗口从句条件,窗口规范默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

	6、当ORDER BY和窗口从句都缺失, 窗口规范默认是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

	7、OVER从句支持以下函数, 但是并不支持和窗口一起使用它们。

	8、Ranking函数: Rank, NTile, DenseRank, CumeDist, PercentRank.
	Lead 和 Lag 函数.

	1.3 分析函数
	ROW_NUMBER(): 从1开始,按照顺序,生成分组内记录的序列,比如,按照pv降序排列,生成分组内每天的pv名次,ROW_NUMBER()的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。
	RANK(): 生成数据项在分组中的排名,排名相等会在名次中留下空位(1,2,2,4)
	DENSE_RANK() :生成数据项在分组中的排名,排名相等会在名次中不会留下空位(1,2,2,3)
	CUME_DIST(col): 小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例
	PERCENT_RANK(col): 分组内当前行的RANK值-1/分组内总行数-1
	NTILE(n) :用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。
	NTILE不支持ROWS BETWEEN,
	比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。
		#over从句
		over
		----mapreduce优化
			set mapreduce.job.reduces=partition_number;
			set hive.map.aggr=true
		----group by 优化
		不可以和over从句配合,必须聚合
			set hive.groupby.skewindata=true
	
	------分区表
	partition by + order by
	
	distribute by + sort by
	
	cluster by =>distribute by + sort by  基本不用
	
	
	aggr/analyze/window   over(partition by f1 order by f2/distribute by f1 sort by f2
	rows/range between ? and ?) alias
	
	over()
		unbounded preceding : table first row
		unbounded following : table last row  如果over加上order by 为current row
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值