首页 > 其他分享 >列转行-explode_outer及lateral view outer

列转行-explode_outer及lateral view outer

时间:2024-09-08 18:52:50浏览次数:15  
标签:r002 outer lateral list order explode id

一、基础数据

现有骑手id,订单id列表,订单配送距离列表,配送费列表,其中订单id、配送距离、配送费一一对应。

+-----------+---------------------------+----------------------------+-----------------------------+
| rider_id  |        order_list         |       distance_list        |        payment_list         |
+-----------+---------------------------+----------------------------+-----------------------------+
| r001      | 0001,0005,0008            | 8.05,2.32,4.35             | 7.50,5.00,15.00             |
| r002      | 0002,0004,0006,0009,0010  | 3.01,10.98,0.78,5.05,6.05  | 13.00,15.00,5.00,9.50,7.00  |
| r003      | 0003,0007                 | 4.12,8.11                  | 3.50,8.00                   |
| r004      | NULL                      | NULL                       | NULL                        |
+-----------+---------------------------+----------------------------+-----------------------------+

二、函数介绍

三、列转行

将骑手及其订单转换成订单粒度,每单一行记录。需要把骑手r004数据进行展示

期望结果

+-----------+-----------+
| rider_id  | order_id  |
+-----------+-----------+
| r001      | 0001      |
| r001      | 0005      |
| r001      | 0008      |
| r002      | 0002      |
| r002      | 0004      |
| r002      | 0006      |
| r002      | 0009      |
| r002      | 0010      |
| r003      | 0003      |
| r003      | 0007      |
| r004      | NULL      |
+-----------+-----------+

1、lateral view outer explode方案

先将字符串通过split函数转换成array,然后使用explode炸开,即可得到最终结果。这里我们不在使用lateral view 而是使用lateral view outer 完成

select rider_id, order_id
from t2_delivery_orders
         lateral view outer explode(split(order_list, ',')) t2 as order_id

执行结果

+-----------+-----------+
| rider_id  | order_id  |
+-----------+-----------+
| r001      | 0001      |
| r001      | 0005      |
| r001      | 0008      |
| r002      | 0002      |
| r002      | 0004      |
| r002      | 0006      |
| r002      | 0009      |
| r002      | 0010      |
| r003      | 0003      |
| r003      | 0007      |
| r004      | NULL      |
+-----------+-----------+

2、lateral view explode_outer解决方法

2.1 explode和explode_outer函数比较

我们先看下在order_list列使用explode函数和explode_outer函数的结果

explode

select explode(split(order_list,',')) as order_id
from t2_delivery_orders

执行结果

+-----------+
| order_id  |
+-----------+
| 0001      |
| 0005      |
| 0008      |
| 0002      |
| 0004      |
| 0006      |
| 0009      |
| 0010      |
| 0003      |
| 0007      |
+-----------+

explode_outer

select explode_outer(split(order_list,',')) as order_id
from t2_delivery_orders

执行结果

+-----------+
| order_id  |
+-----------+
| 0001      |
| 0005      |
| 0008      |
| 0002      |
| 0004      |
| 0006      |
| 0009      |
| 0010      |
| 0003      |
| 0007      |
| NULL      |
+-----------+

r004行对应的order_id使用explode_outer后,会有对应一个空值行。

2.2 解决sql

执行SQL

select rider_id, order_id
from t2_delivery_orders
         lateral view explode_outer(split(order_list, ',')) t2 as order_id

SQL结果

+-----------+-----------+
| rider_id  | order_id  |
+-----------+-----------+
| r001      | 0001      |
| r001      | 0005      |
| r001      | 0008      |
| r002      | 0002      |
| r002      | 0004      |
| r002      | 0006      |
| r002      | 0009      |
| r002      | 0010      |
| r003      | 0003      |
| r003      | 0007      |
| r004      | NULL      |
+-----------+-----------+

四、数据准备

--建表语句
CREATE TABLE IF NOT EXISTS t2_delivery_orders
(
    rider_id      string, -- 骑手ID
    order_list    string, -- 订单id列表
    distance_list STRING, --订单距离列表
    payment_list  STRING  --配送费列表
)
    COMMENT '骑手配送订单表';
--插入数据
INSERT INTO t2_delivery_orders VALUES
('r001', '0001,0005,0008', '8.05,2.32,4.35', '7.50,5.00,15.00'),
('r002', '0002,0004,0006,0009,0010', '3.01,10.98,0.78,5.05,6.05', '13.00,15.00,5.00,9.50,7.00'),
('r003', '0003,0007', '4.12,8.11', '3.50,8.00'),
('r004', null, null, null);

相关推荐

  1. 行转列-collect_list,collect_set进行简单行转列
  2. 行转列-使用transform进行有序行转列
  3. 行转列-使用transform进行有序行转列-多列一一对应
  4. 行转列-多行转多列(竖表转横表)
  5. 列转行-多列转多行(横表变竖表)
  6. 列转行-lateral view explode列转行
  7. 列转行-explode_outer和lateral view outer
  8. 列转行-posexplode多列对应转行
  9. 列转行-lateral view outer posexplode及posexplode_outer多列对应转行

标签:r002,outer,lateral,list,order,explode,id
From: https://blog.csdn.net/thenowaiting/article/details/142031180

相关文章

  • 关于Tailscale Subnet routers要说的
    国内的水文很多,Tailscale的部署就不说了。简单的都有讲到,但凡深度一点儿的只能找找外边儿的文章了。昨天刚给群晖装完Tailscale,打算着利用Subnetrouters功能来访问另外的2个子网。国内的水文在介绍这一段使用的时候是这样的:该文章提到:如果有多个网段添加,就多运行上面说到的......
  • vue路由传参接收以及传参对象为对象时的问题及解决--router
    场景:<div@click='toDetail'>查看详情</div>路由传参不能直接传一个对象,需要使用JSON.stringify()方法将其转换成一个字符串,然后在其他页面接受的时候再使用JSON.parse()方法转换成一个对象constrouter=useRouter()consttoDetail=()=>{   //我使用的是Vue3,rout......
  • router跳转page页面
    模块内跳转:entry模块内有两个页面entrysrcmainetspagesPageA.etsPageB.ets router.pushUrl({url:"pages/PageA.ets"})//跳转至PageArouter.pushUrl({url:"pages/PageB.ets"}......
  • React-Router V6
    React-RouterV6React路由原理不同的路径渲染不同的组件有两种实现方式HashRouter:利用hash实现路由切换BrowserRouter:实现h5Api实现路由的切换HashRouterHashRouter利用hash实现路由切换public\index.html<!DOCTYPEhtml><htmllang="en"><head>......
  • vue3 vue-router 的基本使用和配置方法
    在 vue3 中使用 vue-router 的基本步骤如下:1.安装vue-router:npminstallvue-router@42.创建一个 vue-router 实例并定义路由:import{createRouter,createWebHistory}from'vue-router';importHomefrom'./components/Home.vue';importAboutfrom'./com......
  • router+firewall+switch
    1、网络拓扑图2、核心配置1)端口ip地址intg0/0/0ipaddress10.1.2.224intg1/0/0ipaddress10.1.1.1242)加入trustuntrustdmzfirewallzonetrustaddintg0/0/0firewallzoneuntrustaddintg1/0/03)security-policysecurity-policyrulenameintoout source-zonetru......
  • Angular路由RouterLink指令和Router
      RouterLink指令RouterLink的属性[queryParams](查询参数)用法:<a[routerLink]="['/danone']"[queryParams]="{id:1,name:'abc',date:'2020-6-19'}"[state]="{tracingId:123}">达能</a> url......
  • vue-router 跳转异常 Error: Navigation cancelled from “/“ to “/home“ with a n
    异常信息:Error:Havigationcancelledfrom"/"to"/home"withanewnavigation ,如下图:原因:    1、这个错误是vue-router内部错误,没有进行catch处理,导致的编程式导航跳转问题,往同一地址跳转时会报错的情况。push和replace都会导致这个情况的发生。   ......
  • 【VUE声明式导航跳转如何传参】router-link查询参数传参&动态路由传参
    VUE声明式导航跳转如何传参文章目录VUE声明式导航跳转如何传参前言一、查询参数传参语法实现步骤1.实现【首页】和【搜索页】的基础点击功能2.实现【首页】向【搜索页】跳转时的传参功能JS中如何获取传值二、动态路由传参语法实现步骤1.实现首页和搜索页的基础功能2.......
  • Vue3 + Vue Router实现动态路由导航
    Vue3+VueRouter实现动态路由导航随着单页面应用程序(SPA)的日益流行,前端开发逐渐向复杂且交互性强的方向发展。在这个过程中,Vue.js及其生态圈的工具(如VueRouter)为我们提供了强大的支持。本文将介绍如何在Vue3中使用VueRouter实现动态路由导航,帮助你增强应用的灵活......