hive表中数据导出
- insert导出
将查询的结果导出到本地 insert overwrite local directory '/export/servers/exporthive' select * from score; 将查询的结果格式化导出到本地 insert overwrite local directory '/export/servers/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from student; 将查询的结果导出到HDFS上(没有local) insert overwrite directory '/export/servers/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from score;
- Hadoop命令导出到本地
dfs -get /export/servers/exporthive/000000_0 /export/servers/exporthive/local.txt;
- hive shell 命令导出
基本语法:(hive -f/-e 执行语句或者脚本 > file) hive -e "select * from myhive.score;" > /export/servers/exporthive/score.txt hive -f export.sh > /export/servers/exporthive/score.txt
- export导出到HDFS上
export table score to '/export/exporthive/score';
hive的DQL查询语法
单表查询
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list [HAVING condition]] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] ] [LIMIT number]
注意:
1、order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
2、sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
3、distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。
4、Cluster by(字段) 除了具有Distribute by的功能外,还会对该字段进行排序。
因此,如果分桶和sort字段是同一个时,此时,cluster by = distribute by + sort by
- WHERE语句
select * from score where s_score < 60;
注意:
小于某个值是不包含null的,如上查询结果是把 s_score 为 null 的行剔除的
- GROUP BY 分组
select s_id ,avg(s_score) from score group by s_id; 分组后对数据进行筛选,使用having select s_id ,avg(s_score) avgscore from score group by s_id having avgscore > 85;
注意:
如果使用 group by 分组,则 select 后面只能写分组的字段或者聚合函数
where和having区别:
1 having是在 group by 分完组之后再对数据进行筛选,所以having 要筛选的字段只能是分组字段或者聚合函数
2 where 是从数据表中的字段直接进行的筛选的,所以不能跟在gruop by后面,也不能使用聚合函数
- join 连接
INNER JOIN 内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来 select * from techer t [inner] join course c on t.t_id = c.t_id; -- inner 可省略 LEFT OUTER JOIN 左外连接:左边所有数据会被返回,右边符合条件的被返回 select * from techer t left join course c on t.t_id = c.t_id; -- outer可省略 RIGHT OUTER JOIN 右外连接:右边所有数据会被返回,左边符合条件的被返回、 select * from techer t right join course c on t.t_id = c.t_id; FULL OUTER JOIN 满外(全外)连接: 将会返回所有表中符合条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。 SELECT * FROM techer t FULL JOIN course c ON t.t_id = c.t_id ;
注:1. hive2版本已经支持不等值连接,就是 join on条件后面可以使用大于小于符号了;并且也支持 join on 条件后跟or (早前版本 on 后只支持 = 和 and,不支持 > < 和 or)
2.如hive执行引擎使用MapReduce,一个join就会启动一个job,一条sql语句中如有多个join,则会启动多个job
注意:表之间用逗号(,)连接和 inner join 是一样的
select * from table_a,table_b where table_a.id=table_b.id;
它们的执行效率没有区别,只是书写方式不同,用逗号是sql 89标准,join 是sql 92标准。用逗号连接后面过滤条件用 where ,用 join 连接后面过滤条件是 on。
- order by 排序
全局排序,只会有一个reduce ASC(ascend): 升序(默认) DESC(descend): 降序 SELECT * FROM student s LEFT JOIN score sco ON s.s_id = sco.s_id ORDER BY sco.s_score DESC;
注意:order by 是全局排序,所以最后只有一个reduce,也就是在一个节点执行,如果数据量太大,就会耗费较长时间
- sort by 局部排序
每个MapReduce内部进行排序,对全局结果集来说不是排序。 设置reduce个数 set mapreduce.job.reduces=3; 查看设置reduce个数 set mapreduce.job.reduces; 查询成绩按照成绩降序排列 select * from score sort by s_score; 将查询结果导入到文件中(按照成绩降序排列) insert overwrite local directory '/export/servers/hivedatas/sort' select * from score sort by s_score;
- distribute by 分区排序
distribute by:类似MR中partition,进行分区,结合sort by使用 设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去 set mapreduce.job.reduces=7; 通过distribute by 进行数据的分区 select * from score distribute by s_id sort by s_score;
注意:Hive要求 distribute by 语句要写在 sort by 语句之前
- cluster by
当distribute by和sort by字段相同时,可以使用cluster by方式. cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是正序排序,不能指定排序规则为ASC或者DESC。 以下两种写法等价 select * from score cluster by s_id; select * from score distribute by s_id sort by s_id;
Hive函数
聚合函数
hive支持 count(),max(),min(),sum(),avg() 等常用的聚合函数
注意:
聚合操作时要注意null值
count(*) 包含null值,统计所有行数
count(id) 不包含null值
min 求最小值是不包含null,除非所有值都是null
avg 求平均值也是不包含null
- 非空集合总体变量函数: var_pop
语法: var_pop(col) 返回值: double 说明: 统计结果集中col非空集合的总体变量(忽略null)
- 非空集合样本变量函数: var_samp
语法: var_samp (col) 返回值: double 说明: 统计结果集中col非空集合的样本变量(忽略null)
- 总体标准偏离函数: stddev_pop
语法: stddev_pop(col) 返回值: double 说明: 该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同
- 中位数函数: percentile
语法: percentile(BIGINT col, p) 返回值: double 说明: 求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型
关系运算
支持:等值(=)、不等值(!= 或 <>)、小于(<)、小于等于(<=)、大于(>)、大于等于(>=) 空值判断(is null)、非空判断(is not null)
- LIKE比较: LIKE
语法: A LIKE B 操作类型: strings 描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。
- JAVA的LIKE操作: RLIKE
语法: A RLIKE B 操作类型: strings 描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。
- REGEXP操作: REGEXP
语法: A REGEXP B 操作类型: strings 描述: 功能与RLIKE相同 示例:select 1 from tableName where 'footbar' REGEXP '^f.*r$'; 结果:1
数学运算
支持所有数值类型:加(+)、减(-)、乘(*)、除(/)、取余(%)、位与(&)、位或(|)、位异或(^)、位取反(~)
逻辑运算
支持:逻辑与(and)、逻辑或(or)、逻辑非(not)
数值运算
- 取整函数: round
语法: round(double a) 返回值: BIGINT 说明: 返回double类型的整数值部分 (遵循四舍五入) 示例:select round(3.1415926) from tableName; 结果:3
- 指定精度取整函数: round
语法: round(double a, int d) 返回值: DOUBLE 说明: 返回指定精度d的double类型 hive> select round(3.1415926,4) from tableName; 3.1416
- 向下取整函数: floor
语法: floor(double a) 返回值: BIGINT 说明: 返回等于或者小于该double变量的最大的整数 hive> select floor(3.641) from tableName; 3
- 向上取整函数: ceil
语法: ceil(double a) 返回值: BIGINT 说明: 返回等于或者大于该double变量的最小的整数 hive> select ceil(3.1415926) from tableName; 4
- 取随机数函数: rand
语法: rand(),rand(int seed) 返回值: double 说明: 返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列 hive> select rand() from tableName; -- 每次执行此语句得到的结果都不同 0.5577432776034763 hive> select rand(100) ; -- 只要指定种子,每次执行此语句得到的结果一样的 0.7220096548596434
- 自然指数函数: exp
语法: exp(double a) 返回值: double 说明: 返回自然对数e的a次方 hive> select exp(2) ; 7.38905609893065
- 以10为底对数函数: log10
语法: log10(double a) 返回值: double 说明: 返回以10为底的a的对数 hive> select log10(100) ; 2.0
此外还有:以2为底对数函数: log2()、对数函数: log()
- 幂运算函数: pow
语法: pow(double a, double p) 返回值: double 说明: 返回a的p次幂 hive> select pow(2,4) ; 16.0
- 开平方函数: sqrt
语法: sqrt(double a) 返回值: double 说明: 返回a的平方根 hive> select sqrt(16) ; 4.0
- 二进制函数: bin
语法: bin(BIGINT a) 返回值: string 说明: 返回a的二进制代码表示 hive> select bin(7) ; 111
十六进制函数: hex()、将十六进制转化为字符串函数: unhex()
进制转换函数: conv(bigint num, int from_base, int to_base) 说明: 将数值num从from_base进制转化到to_base进制
此外还有很多数学函数: 绝对值函数: abs()、正取余函数: pmod()、正弦函数: sin()、反正弦函数: asin()、余弦函数: cos()、反余弦函数: acos()、positive函数: positive()、negative函数: negative()
条件函数
- If函数: if
语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull) 返回值: T 说明: 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull hive> select if(1=2,100,200) ; 200 hive> select if(1=1,100,200) ; 100
- 非空查找函数: coalesce
语法: coalesce(T v1, T v2, …) 返回值: T 说明: 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL hive> select coalesce(null,'100','50') ; 100
- 条件判断函数:case when (两种写法,其一)
语法: case when a then b [when c then d]* [else e] end 返回值: T 说明:如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e hive> select case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end from tableName; mary
- 条件判断函数:case when (两种写法,其二)
语法: case a when b then c [when d then e]* [else f] end 返回值: T 说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f hive> Select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end from tableName; mary
日期函数
注:以下SQL语句中的 from tableName 可去掉,不影响查询结果
- 获取当前UNIX时间戳函数: unix_timestamp
语法: unix_timestamp() 返回值: bigint 说明: 获得当前时区的UNIX时间戳 hive> select unix_timestamp() from tableName; 1616906976
- UNIX时间戳转日期函数: from_unixtime
语法: from_unixtime(bigint unixtime[, string format]) 返回值: string 说明: 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式 hive> select from_unixtime(1616906976,'yyyyMMdd') from tableName; 20210328
- 日期转UNIX时间戳函数: unix_timestamp
语法: unix_timestamp(string date) 返回值: bigint 说明: 转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。 hive> select unix_timestamp('2021-03-08 14:21:15') from tableName; 1615184475
- 指定格式日期转UNIX时间戳函数: unix_timestamp
语法: unix_timestamp(string date, string pattern) 返回值: bigint 说明: 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。 hive> select unix_timestamp('2021-03-08 14:21:15','yyyyMMdd HH:mm:ss') from tableName; 1615184475
- 日期时间转日期函数: to_date
语法: to_date(string timestamp) 返回值: string 说明: 返回日期时间字段中的日期部分。 hive> select to_date('2021-03-28 14:03:01') from tableName; 2021-03-28
- 日期转年函数: year
语法: year(string date) 返回值: int 说明: 返回日期中的年。 hive> select year('2021-03-28 10:03:01') from tableName; 2021 hive> select year('2021-03-28') from tableName; 2021
- 日期转月函数: month
语法: month (string date) 返回值: int 说明: 返回日期中的月份。 hive> select month('2020-12-28 12:03:01') from tableName; 12 hive> select month('2021-03-08') from tableName; 8
- 日期转天函数: day
语法: day (string date) 返回值: int 说明: 返回日期中的天。 hive> select day('2020-12-08 10:03:01') from tableName; 8 hive> select day('2020-12-24') from tableName; 24
- 日期转小时函数: hour
语法: hour (string date) 返回值: int 说明: 返回日期中的小时。 hive> select hour('2020-12-08 10:03:01') from tableName; 10
- 日期转分钟函数: minute
语法: minute (string date) 返回值: int 说明: 返回日期中的分钟。 hive> select minute('2020-12-08 10:03:01') from tableName; 3
- 日期转秒函数: second
语法: second (string date) 返回值: int 说明: 返回日期中的秒。 hive> select second('2020-12-08 10:03:01') from tableName; 1
- 日期转周函数: weekofyear
语法: weekofyear (string date) 返回值: int 说明: 返回日期在当前的周数。 hive> select weekofyear('2020-12-08 10:03:01') from tableName; 49
- 日期比较函数: datediff
语法: datediff(string enddate, string startdate) 返回值: int 说明: 返回结束日期减去开始日期的天数。 hive> select datediff('2020-12-08','2012-05-09') from tableName; 213
- 日期增加函数: date_add
语法: date_add(string startdate, int days) 返回值: string 说明: 返回开始日期startdate增加days天后的日期。 hive> select date_add('2020-12-08',10) from tableName; 2020-12-18
- 日期减少函数: date_sub
语法: date_sub (string startdate, int days) 返回值: string 说明: 返回开始日期startdate减少days天后的日期。 hive> select date_sub('2020-12-08',10) from tableName; 2020-11-28
字符串函数
- 字符串长度函数:length
语法: length(string A) 返回值: int 说明:返回字符串A的长度 hive> select length('abcedfg') from tableName; 7
- 字符串反转函数:reverse
语法: reverse(string A) 返回值: string 说明:返回字符串A的反转结果 hive> select reverse('abcedfg') from tableName; gfdecba
- 字符串连接函数:concat
语法: concat(string A, string B…) 返回值: string 说明:返回输入字符串连接后的结果,支持任意个输入字符串 hive> select concat('abc','def’,'gh')from tableName; abcdefgh
- 带分隔符字符串连接函数:concat_ws
语法: concat_ws(string SEP, string A, string B…) 返回值: string 说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符 hive> select concat_ws(',','abc','def','gh')from tableName; abc,def,gh
- 字符串截取函数:substr,substring
语法: substr(string A, int start),substring(string A, int start) 返回值: string 说明:返回字符串A从start位置到结尾的字符串 hive> select substr('abcde',3) from tableName; cde hive> select substring('abcde',3) from tableName; cde hive> select substr('abcde',-1) from tableName; (和ORACLE相同) e
- 字符串截取函数:substr,substring
语法: substr(string A, int start, int len),substring(string A, int start, int len) 返回值: string 说明:返回字符串A从start位置开始,长度为len的字符串 hive> select substr('abcde',3,2) from tableName; cd hive> select substring('abcde',3,2) from tableName; cd hive>select substring('abcde',-2,2) from tableName; de
- 字符串转大写函数:upper,ucase
语法: upper(string A) ucase(string A) 返回值: string 说明:返回字符串A的大写格式 hive> select upper('abSEd') from tableName; ABSED hive> select ucase('abSEd') from tableName; ABSED
- 字符串转小写函数:lower,lcase
语法: lower(string A) lcase(string A) 返回值: string 说明:返回字符串A的小写格式 hive> select lower('abSEd') from tableName; absed hive> select lcase('abSEd') from tableName; absed
- 去空格函数:trim
语法: trim(string A) 返回值: string 说明:去除字符串两边的空格 hive> select trim(' abc ') from tableName; abc
- 左边去空格函数:ltrim
语法: ltrim(string A) 返回值: string 说明:去除字符串左边的空格 hive> select ltrim(' abc ') from tableName; abc
- 右边去空格函数:rtrim
语法: rtrim(string A) 返回值: string 说明:去除字符串右边的空格 hive> select rtrim(' abc ') from tableName; abc
- 正则表达式替换函数:regexp_replace
语法: regexp_replace(string A, string B, string C) 返回值: string 说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。 hive> select regexp_replace('foobar', 'oo|ar', '') from tableName; fb
- 正则表达式解析函数:regexp_extract
语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。 hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) from tableName; the hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 2) from tableName; bar hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 0) from tableName; foothebar strong>注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。 select data_field, regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa, regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb, regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc from pt_nginx_loginlog_st where pt = '2021-03-28' limit 2;
- URL解析函数:parse_url
语法: parse_url(string urlString, string partToExtract [, string keyToExtract]) 返回值: string 说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO. hive> select parse_url ('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from tableName; www.tableName.com hive> select parse_url ('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1') from tableName; v1
- json解析函数:get_json_object
语法: get_json_object(string json_string, string path) 返回值: string 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。 hive> select get_json_object('{"store":{"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} },"email":"amy@only_for_json_udf_test.net","owner":"amy"}','$.owner') from tableName;
- 空格字符串函数:space
语法: space(int n) 返回值: string 说明:返回长度为n的字符串 hive> select space(10) from tableName; hive> select length(space(10)) from tableName; 10
- 重复字符串函数:repeat
语法: repeat(string str, int n) 返回值: string 说明:返回重复n次后的str字符串 hive> select repeat('abc',5) from tableName; abcabcabcabcabc
- 首字符ascii函数:ascii
语法: ascii(string str) 返回值: int 说明:返回字符串str第一个字符的ascii码 hive> select ascii('abcde') from tableName; 97
- 左补足函数:lpad
语法: lpad(string str, int len, string pad) 返回值: string 说明:将str进行用pad进行左补足到len位 hive> select lpad('abc',10,'td') from tableName; tdtdtdtabc 注意:与GP,ORACLE不同,pad 不能默认
- 右补足函数:rpad
语法: rpad(string str, int len, string pad) 返回值: string 说明:将str进行用pad进行右补足到len位 hive> select rpad('abc',10,'td') from tableName; abctdtdtdt
- 分割字符串函数: split
语法: split(string str, string pat) 返回值: array 说明: 按照pat字符串分割str,会返回分割后的字符串数组 hive> select split('abtcdtef','t') from tableName; ["ab","cd","ef"]
- 集合查找函数: find_in_set
语法: find_in_set(string str, string strList) 返回值: int 说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0 hive> select find_in_set('ab','ef,ab,de') from tableName; 2 hive> select find_in_set('at','ef,ab,de') from tableName; 0
复合类型构建操作
- Map类型构建: map
语法: map (key1, value1, key2, value2, …) 说明:根据输入的key和value对构建map类型 hive> Create table mapTable as select map('100','tom','200','mary') as t from tableName; hive> describe mapTable; t map<string ,string> hive> select t from tableName; {"100":"tom","200":"mary"}
- Struct类型构建: struct
语法: struct(val1, val2, val3, …) 说明:根据输入的参数构建结构体struct类型 hive> create table struct_table as select struct('tom','mary','tim') as t from tableName; hive> describe struct_table; t struct<col1:string ,col2:string,col3:string> hive> select t from tableName; {"col1":"tom","col2":"mary","col3":"tim"}
- array类型构建: array
语法: array(val1, val2, …) 说明:根据输入的参数构建数组array类型 hive> create table arr_table as select array("tom","mary","tim") as t from tableName; hive> describe tableName; t array<string> hive> select t from tableName; ["tom","mary","tim"]
复杂类型访问操作
- array类型访问: A[n]
语法: A[n] 操作类型: A为array类型,n为int类型 说明:返回数组A中的第n个变量值。数组的起始下标为0。比如,A是个值为['foo', 'bar']的数组类型,那么A[0]将返回'foo',而A[1]将返回'bar' hive> create table arr_table2 as select array("tom","mary","tim") as t from tableName; hive> select t[0],t[1] from arr_table2; tom mary tim
- map类型访问: M[key]
语法: M[key] 操作类型: M为map类型,key为map中的key值 说明:返回map类型M中,key值为指定值的value值。比如,M是值为{'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}的map类型,那么M['all']将会返回'foobar' hive> Create table map_table2 as select map('100','tom','200','mary') as t from tableName; hive> select t['200'],t['100'] from map_table2; mary tom
- struct类型访问: S.x
语法: S.x 操作类型: S为struct类型 说明:返回结构体S中的x字段。比如,对于结构体struct foobar {int foo, int bar},foobar.foo返回结构体中的foo字段 hive> create table str_table2 as select struct('tom','mary','tim') as t from tableName; hive> describe tableName; t struct<col1:string ,col2:string,col3:string> hive> select t.col1,t.col3 from str_table2; tom tim
复杂类型长度统计函数
- Map类型长度函数: size(Map<k .V>)
语法: size(Map<k .V>) 返回值: int 说明: 返回map类型的长度 hive> select size(t) from map_table2; 2
- array类型长度函数: size(Array)
语法: size(Array<T>) 返回值: int 说明: 返回array类型的长度 hive> select size(t) from arr_table2; 4
- 类型转换函数 ***
类型转换函数: cast 语法: cast(expr as <type>) 返回值: Expected "=" to follow "type" 说明: 返回转换后的数据类型 hive> select cast('1' as bigint) from tableName; 1
hive当中的lateral view 与 explode以及reflect
使用explode函数将hive表中的Map和Array字段数据进行拆分
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
其中explode还可以用于将hive一列中复杂的array或者map结构拆分成多行
需求:现在有数据格式如下
zhangsan child1,child2,child3,child4 k1:v1,k2:v2 lisi child5,child6,child7,child8 k3:v3,k4:v4
字段之间使用\t分割,需求将所有的child进行拆开成为一列
+----------+--+ | mychild | +----------+--+ | child1 | | child2 | | child3 | | child4 | | child5 | | child6 | | child7 | | child8 | +----------+--+
将map的key和value也进行拆开,成为如下结果
+-----------+-------------+--+ | mymapkey | mymapvalue | +-----------+-------------+--+ | k1 | v1 | | k2 | v2 | | k3 | v3 | | k4 | v4 | +-----------+-------------+--+
- 创建hive数据库
创建hive数据库 hive (default)> create database hive_explode; hive (default)> use hive_explode;
- 创建hive表,然后使用explode拆分map和array
hive (hive_explode)> create table t3(name string,children array<string>,address Map<string,string>) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' stored as textFile;
- 加载数据
node03执行以下命令创建表数据文件 mkdir -p /export/servers/hivedatas/ cd /export/servers/hivedatas/ vim maparray 内容如下: zhangsan child1,child2,child3,child4 k1:v1,k2:v2 lisi child5,child6,child7,child8 k3:v3,k4:v4 hive表当中加载数据 hive (hive_explode)> load data local inpath '/export/servers/hivedatas/maparray' into table t3;
- 使用explode将hive当中数据拆开
将array当中的数据拆分开 hive (hive_explode)> SELECT explode(children) AS myChild FROM t3; 将map当中的数据拆分开 hive (hive_explode)> SELECT explode(address) AS (myMapKey, myMapValue) FROM t3;
使用explode拆分json字符串
需求: 需求:现在有一些数据格式如下:
a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
其中字段与字段之间的分隔符是 |
我们要解析得到所有的monthSales对应的值为以下这一列(行转列)
4900
2090
6987
- 创建hive表
hive (hive_explode)> create table explode_lateral_view > (`area` string, > `goods_id` string, > `sale_info` string) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '|' > STORED AS textfile;
- 准备数据并加载数据
准备数据如下 cd /export/servers/hivedatas vim explode_json a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] 加载数据到hive表当中去 hive (hive_explode)> load data local inpath '/export/servers/hivedatas/explode_json' overwrite into table explode_lateral_view;
- 使用explode拆分Array
hive (hive_explode)> select explode(split(goods_id,',')) as goods_id from explode_lateral_view;
- 使用explode拆解Map
hive (hive_explode)> select explode(split(area,',')) as area from explode_lateral_view;