explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分),
本身已经违背了数据库的设计原理(不论是业务系统还是数据仓库系统),不过大数据技术普及后,很多类似pv,uv的数据,在业务系统中是存贮在非关系型数据库中,
用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身手。

explode作用是处理map结构的字段,使用案例如下(hive自带map,struct,array字段类型,但是需要先定义好泛型,所以在此案例不使用):
建表语句:
drop table explode_lateral_view;
create table explode_lateral_view
(`area` string,
`goods_id` string,
`sale_info` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS textfile;

导入数据:
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"}]

表内数据如下

explode的使用
我们只 拆解array字段,语句为select explode(split(goods_id,',')) as goods_id from explode_lateral_view;
结果如下

拆解map字段,语句为select explode(split(area,',')) as area from explode_lateral_view;

我们会得到如下结果:

拆解json字段

这个时候要配合一下get_json_object

我们想获取所有的monthSales,第一步我们先把这个字段拆成list,并且拆成行展示:

select explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')) as  sale_info from explode_lateral_view;

然后我们想用get_json_object来获取key为monthSales的数据:
select get_json_object(explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')),'$.monthSales') as  sale_info from explode_lateral_view;
然后挂了FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
UDTF explode不能写在别的函数内
如果你这么写,想查两个字段,select explode(split(area,',')) as area,good_id from explode_lateral_view;
会报错FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's. Error encountered near token 'good_id'
使用UDTF的时候,只支持一个字段,这时候就需要LATERAL VIEW出场了

LATERAL VIEW的使用:
侧视图的意义是配合explode(或者其他的UDTF),一个语句生成把单行数据拆解成多行后的数据结果集。

select goods_id2,sale_info from explode_lateral_view LATERAL VIEW explode(split(goods_id,','))goods as goods_id2;

其中LATERAL VIEW explode(split(goods_id,','))goods相当于一个虚拟表,与原表explode_lateral_view笛卡尔积关联。
也可以多重使用
select goods_id2,sale_info,area2
from explode_lateral_view 
LATERAL VIEW explode(split(goods_id,','))goods as goods_id2 
LATERAL VIEW explode(split(area,','))area as area2;
也是三个表笛卡尔积的结果

现在我们解决一下上面的问题,从sale_info字段中找出所有的monthSales并且行展示
select get_json_object(concat('{',sale_info_r,'}'),'$.monthSales') as monthSales from explode_lateral_view 
LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_r;

最终,我们可以通过下面的句子,把这个json格式的一行数据,完全转换成二维表的方式展现

select get_json_object(concat('{',sale_info_1,'}'),'$.source') as source,
     get_json_object(concat('{',sale_info_1,'}'),'$.monthSales') as monthSales,
     get_json_object(concat('{',sale_info_1,'}'),'$.userCount') as monthSales,
     get_json_object(concat('{',sale_info_1,'}'),'$.score') as monthSales
  from explode_lateral_view

LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_1;

hive中的lateral view 与 explode函数的使用相关推荐

  1. mysql explode函数_hive中,lateral view 与 explode函数

    hive中常规处理json数据,array类型json用get_json_object(#,"$.#")这个方法足够了,map类型复合型json就需要通过数据处理才能解析. exp ...

  2. hive中的lateral view的解析

    hive中的lateral view的解析 用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身 ...

  3. hive中的 lateral view

    lateral view用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合. 一个简单的例子,假设我们有一张表pageAds,它有 ...

  4. hive的lateral view 与 explode函数的使用transArray

    主要介绍explode和posexplode函数的使用.类似于flatmap把一个数组打散 lateral view 侧视图.原表的每一行和explode_lateral_view进行笛卡尔积关联,也 ...

  5. hive/mysql使用lateral view explode时会出现的问题(bug)

    hive/mysql使用lateral view explode时会出现的问题 例子 两边计算的区别 问题说明 例子 两边计算的区别 上面两边代码除了右边对disp_detail和clk_detail ...

  6. Hive列转行 (Lateral View + explode)详解

    需求: <疑犯> 悬疑,动作,科幻,爱情 <lies> 悬疑,警匪,动作,心理,剧情 <战狼> 战争,动作,灾难转成如下格式:<疑犯> 悬疑 <疑 ...

  7. hive sql之lateral view explode用法

    这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行

  8. lateral view 和explode

    描述 lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合.lateral view首先为原始表的每行调用U ...

  9. php字符串副职_PHP explode()函数

    源起:将日期格式的字符串拆分成年.月.日,用于组织关系介绍信的特定位置打印.感谢倪同学提供思路 定义和用法 explode()函数把字符串分割为数组 语法 explode(separator,stri ...

最新文章

  1. 基于php双引号中访问数组元素
  2. php中设定一个全局异常处理。全局catch。默认catch。默认异常处理
  3. 基于 Java 2 运行时安全模型的线程协作--转
  4. Linux期末复习编程题
  5. lnmp之php5.6.29安装
  6. SQL基础操作_2_操作多个表
  7. 异步提交表单插件jquery.form.min.js的使用实例
  8. LeakCanary——直白的展现Android中的内存泄露
  9. xml getelementsbytagname php,用PHP编写和读取XML的几种方式
  10. 余承东吐槽苹果续航;微软 IE 浏览器被曝漏洞;React Native 0.61.0 发布 | 极客头条...
  11. 关于Meminfo中MemAvailable 理解
  12. 课时8-1:adams建约束副----齿轮约束
  13. php生成pem文件怎么打开,iOS推送证书生成pem文件(详细步骤)
  14. Echarts数据可视化总结
  15. 属牛的男孩取名:带茂字的男孩名字有哪些
  16. igraph 牛刀小试
  17. 全新电影社交观影,满足影迷移动巨幕与移动3D体验
  18. [XSY 3322][置换+dp]Dexterity
  19. 【神经网络】人工神经网络学习方法
  20. PHP 随机生成电话号码、用户名字

热门文章

  1. Android设备的电池续航时间优化(Optimizing Battery Life)——(一)监听电池电量和电池的充电状态...
  2. 一代经典销声匿迹:WinXP彻底再见了!
  3. CAD制图初学入门常见问题秘笈,助你摆脱节后综合症!(下)
  4. 个人商家怎么申请微信支付接口
  5. day47 视图、触发器、事务、存储过程、函数、流程控制、索引原理
  6. 最小树之kruskal算法
  7. 设置font-family时需要注意的问题
  8. 概率图模型之条件随机场
  9. STM32烧写失败错误:Contents mismatch at: 08000000H (Flash=FFH Required=00H)
  10. 生活中的数学问题(二)