SparkSQL Hive数据库学习笔记(二)

SparkSQL Hive 实现行转列、列转行,实现由图a转图b效果

  • 1、准备学生信息表
  • 2、准备字段表,并记录第一个字段的名字(用于作别名)
  • 3、表t1:将多列成绩转为一列
  • 4、表t2:将一列成绩转为多行
  • 5、表t3:将t2表和字段表通过id连接起来,查询时要带上id以免出现笛卡尔积

图a
a 图b
b

1、准备学生信息表

//创建学生信息表
create table ods_zq_hzllzh_ddl
(id int,name string,Chinese double,English double,Math double);//
//插入学生信息
INSERT INTO ods_zq_hzllzh_ddl VALUES  
(1,'Linda',90,91,92);
//检查是否插入成功
SELECT * FROM ods_zq_hzllzh_ddl;

在这里插入图片描述

2、准备字段表,并记录第一个字段的名字(用于作别名)

//创建字段表,第一个字段为‘name’
create table ods_zq_hzllzhTest_ddl
(id int,field_name_list string);
//插入字段
INSERT INTO ods_zq_hzllzhTest_ddl VALUES  
(1,'Chinese'),
(2,'English'),
(3,'Math');
//检查是否插入成功
SELECT * FROM ods_zq_hzllzhTest_ddl;

在这里插入图片描述

3、表t1:将多列成绩转为一列

select id,
(concat_ws(',',cast(Chinese AS STRING ),cast(English AS STRING ),cast(Math AS STRING ) ))
AS Linda_1
from ods_zq_hzllzh_ddl;t1

在这里插入图片描述

4、表t2:将一列成绩转为多行

第一步:先将t2功能写好

SELECT Linda_2,rank() over(ORDER BY Linda_2 ) AS id
FROM t1
LATERAL VIEW explode(split(t1.Linda_1,',') ) test AS Linda_2;t2

第二步:再将t1代入,下同(注意,代入时不要带分号)

SELECT Linda_2,rank() over(ORDER BY Linda_2 ) AS id
FROM (select id,(concat_ws(',',cast(Chinese AS STRING ),cast(English AS STRING ),cast(Math AS STRING ) ))AS Linda_1
from ods_zq_hzllzh_ddl)t1
LATERAL VIEW explode(split(t1.Linda_1,',') ) test AS Linda_2;t2

在这里插入图片描述

5、表t3:将t2表和字段表通过id连接起来,查询时要带上id以免出现笛卡尔积

第一步:先将t3功能写好

SELECT t2.id,field_name_list AS `name`,Linda_2 AS `Linda`
FROM t2,ods_zq_hzllzhTest_ddl tt
WHERE t2.id=tt.id;

第二步:再将t2代入(注意,代入时不要带分号)

SELECT t2.id,field_name_list AS `name`,Linda_2 AS `Linda`
FROM (SELECT Linda_2,rank() over(ORDER BY Linda_2 ) AS id
FROM (select id,(concat_ws(',',cast(Chinese AS STRING ),cast(English AS STRING ),cast(Math AS STRING ) ))AS Linda_1
from ods_zq_hzllzh_ddl)t1
LATERAL VIEW explode(split(t1.Linda_1,',') ) test AS Linda_2)t2,ods_zq_hzllzhTest_ddl tt
WHERE t2.id=tt.id;t3

在这里插入图片描述

在此非常感谢三位老师的指导OVO

你可能感兴趣的:(SparkSQL数据库,hive,数据库,sql)