大数据Hive行列转换应用与实现

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 大数据Hive行列转换应用与实现
+关注继续查看

1 工作应用场景

实际工作场景中经常需要实现对于Hive中的表进行行列转换操作,例如当前ADS层的数据表,我们统计得到每个小时不同维度下的UV、PV、IP的个数,而现在为了构建可视化报表,得到每个小时的UV、PV的线图,观察访问趋势,我们需要构建如下的表结构:

image

在Hive中,我们可以通过函数来实现各种复杂的行列转换。

2 行转列:多行转多列

2.1 需求

➢ 原始数据表

image

➢ 目标结果表

image

4.2.2 case when判断

➢ 功能

用于实现对数据的判断,根据条件,不同的情况返回不同的结果,类似于Java中的switch case 功能

➢ 语法

➢ 语法一

CASE 
WHEN 条件1 THEN VALUE1
WHEN 条件2 THEN VALUE2
……
WHEN 条件N THEN VALUEN
ELSE 默认值
END

➢ 语法二

CASE 列
WHEN V1 THEN VALUE1
WHEN V2 THEN VALUE2
……
WHEN VN THEN VALUEN
ELSE 默认值
END

➢ 测试

➢ 语法一:当id < 2显示a,当id = 2 显示b ,其他的显示c

select
  id,
  case
  when id < 2 then 'a'
  when id = 2 then 'b'
  else 'c'
  end as caseName
from tb_url;

image

语法二:当id =1 显示a,当id = 2 显示b ,其他的显示c

select
id,
case id
when 1 then 'a'
when 2 then 'b'
else 'c'
end as caseName
from tb_url;

image

2.3 实现

➢ 创建原始数据表,加载数据

--切换数据库
use db_function;
--建表
create table row2col1(
   col1 string,
   col2 string,
   col3 int
) row format delimited fields terminated by '\t';
--加载数据到表中
load data local inpath '/export/data/r2c1.txt' into table row2col1;

image

➢ SQL实现转换

select
  col1 as col1,
  max(case col2 when 'c' then col3 else 0 end) as c,
  max(case col2 when 'd' then col3 else 0 end) as d,
  max(case col2 when 'e' then col3 else 0 end) as e
from
  row2col1
group by
  col1;

image

3 行转列:多行转单列

3.1 需求

➢ 原始数据表

image

➢ 目标数据表image

3.2 concat

➢ 功能:用于实现字符串拼接,不可指定分隔符

➢ 语法

concat(element1,element2,element3……)


➢ 测试

select concat(“it”,“cast”,“And”,“heima”);

±----------------+

| itcastAndheima |

±----------------+


➢ 特点:如果任意一个元素为null,结果就为null

select concat(“it”,“cast”,“And”,null);

±------+

| NULL |

±------+


3.3 concat_ws

➢ 功能:用于实现字符串拼接,可以指定分隔符

➢ 语法

concat_ws(SplitChar,element1,element2……)


➢ 测试

select concat_ws("-",“itcast”,“And”,“heima”);

±------------------+

| itcast-And-heima |

±------------------+


➢ 特点:任意一个元素不为null,结果就不为null

select concat_ws("-",“itcast”,“And”,null);

±------------+

| itcast-And |

±------------+


3.4 collect_list

➢ 功能:用于将一列中的多行合并为一行,不进行去重

➢ 语法

collect_list(colName)

➢ 测试

select collect_list(col1) from row2col1;

±---------------------------+

| [“a”,“a”,“a”,“b”,“b”,“b”] |

±---------------------------+


3.5 concat_set

➢ 功能:用于将一列中的多行合并为一行,并进行去重

➢ 语法

collect_set(colName)


➢ 测试

select collect_set(col1) from row2col1;

±-----------+

| [“b”,“a”] |

±-----------+


3.6 实现

➢ 创建原始数据表,加载数据

--切换数据库
use db_function;

--建表
create table row2col2(
   col1 string,
   col2 string,
   col3 int
)row format delimited fields terminated by '\t';

--加载数据到表中
load data local inpath '/export/data/r2c2.txt' into table row2col2;

➢ SQL实现转换

select
  col1,
  col2,
  concat_ws(',', collect_list(cast(col3 as string))) as col3
from
  row2col2
group by
  col1, col2;

image

4 列转行:多列转多行

4.1 需求

⚫ 原始数据表

image

⚫ 目标结果表

image

4.2 union

➢ 功能:将多个select语句结果合并为一个,且结果去重且排序

➢ 语法

select_statement

UNION [DISTINCT]

select_statement

UNION [DISTINCT]

select_statement …

➢ 测试

select 'b','a','c' 
union 
select 'a','b','c' 
union  
select 'a','b','c';

image

4.3 union all

➢ 功能:将多个select语句结果合并为一个,且结果不去重不排序

➢ 语法

select_statement UNION ALL select_statement UNION ALL select_statement …


➢ 测试

select ‘b’,‘a’,‘c’

union all

select ‘a’,‘b’,‘c’

union allselect ‘a’,‘b’,‘c’;

image

4.4 实现

➢ 创建原始数据表,加载数据

–切换数据库

use db_function;


–创建表

create table col2row1

(

col1 string,

col2 int,

col3 int,

col4 int

) row format delimited fields terminated by ‘\t’;


–加载数据

load data local inpath ‘/export/data/c2r1.txt’ into table col2row1;


➢ SQL实现转换

select col1, ‘c’ as col2, col2 as col3 from col2row1

UNION ALL

select col1, ‘d’ as col2, col3 as col3 from col2row1

UNION ALLselect col1, ‘e’ as col2, col4 as col3 from col2row1;

image

5 列转行:单列转多行

5.1 需求

➢ 原始数据表

image

➢ 目标结果表image

5.2 explode

➢ 功能:用于将一个集合或者数组中的每个元素展开,将每个元素变成一行

➢ 语法

explode( Map | Array)

➢ 测试

select explode(split(“a,b,c,d”,","));image

5.3 实现

➢ 创建原始数据表,加载数据

--切换数据库
use db_function;

--创建表
create table col2row2(
   col1 string,
   col2 string,
   col3 string
)row format delimited fields terminated by '\t';


--加载数据
load data local inpath '/export/data/c2r2.txt' into table col2row2;

➢ SQL实现转换

select
  col1,
  col2,
  lv.col3 as col3
from
  col2row2
    lateral view
  explode(split(col3, ',')) lv as col3;

c43f2c6f218c416bbdae462cfce254f0.png

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
5天前
|
供应链 大数据 数据挖掘
大数据应用
大数据应用
11 1
|
1月前
|
机器学习/深度学习 大数据
机器学习lgb全国大数据创新应用大赛用户贷款风险预测 完整代码数据 可直接运行
机器学习lgb全国大数据创新应用大赛用户贷款风险预测 完整代码数据 可直接运行
20 0
|
2月前
|
数据可视化 关系型数据库 MySQL
2023年职业院校技能大赛中职组----大数据应用与服务赛项任务书试题
2023年职业院校技能大赛中职组----大数据应用与服务赛项任务书试题
219 0
|
2月前
|
SQL 分布式计算 大数据
分享一个大数据应用因为和大数据集群服务端组件的版本冲突引起的问题
分享一个大数据应用因为和大数据集群服务端组件的版本冲突引起的问题
|
2月前
|
Kubernetes 大数据 Docker
Kubernetes 应用问题的通用排查思路 - 大数据从业者之 Kubernetes 必知必会
Kubernetes 应用问题的通用排查思路 - 大数据从业者之 Kubernetes 必知必会
|
2月前
|
SQL 分布式计算 数据挖掘
MaxCompute SQL的应用
MaxCompute SQL的应用
|
3月前
|
机器学习/深度学习 数据采集 算法
解码大数据:模型与算法的奥秘和应用
解码大数据:模型与算法的奥秘和应用
37 0
|
3月前
|
SQL 分布式计算 关系型数据库
大数据Hive安装与应用
大数据Hive安装与应用
69 0
|
4月前
|
存储 算法 大数据
倚天性能优化--基于倚天优化后的zstd在大数据场景应用:降低存储成本+提升重IO场景性能
倚天性能优化--基于倚天优化后的zstd在大数据场景应用:降低存储成本+提升重IO场景性能
|
4月前
|
弹性计算 负载均衡 并行计算
实战案例分析:ECS在电商和大数据领域的应用
本文通过实际案例分析,深入探讨了云服务器ECS在电子商务和大数据领域的应用。在电子商务网站部署方面,我们介绍了如何使用ECS构建稳定的电商平台,包括弹性伸缩和负载均衡的实践。通过示例代码,读者可以了解如何创建ECS实例、配置负载均衡器,以及设置自动伸缩策略,以应对不同流量情况。
130 1
热门文章
最新文章
推荐文章
更多