首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >激发sql如何使用层次结构类型表爆炸行

激发sql如何使用层次结构类型表爆炸行
EN

Stack Overflow用户
提问于 2019-01-25 14:36:09
回答 2查看 237关注 0票数 0

源数据表

/Company/Engineering/DataTeam 45

/Company/Engineering/Mobile 50

输出数据表

/Company 45

/Company/Engineering 45

/Company/Engineering/DataTeam 45

/Company 50

/Company/Engineering 50

/Company/Engineering/MobileTeam 50

因此,我的问题基本上是通过查看上面的源和输出数据表,从源到输出数据表的转换,如何使用spark实现它。

我不能使用UDF,因为有了UDF,您就不能返回行。因此,我的下一步是使用UDF在内存中创建数据帧并追加行。但是这种方法的问题是,数据框架将有超过10亿行,我不确定这是否可行。

对于如何使用spark实现这一点,有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2019-01-28 05:48:04

在UDF中,您可以返回一个SeqString,它可以爆炸以获得多个行。

看看这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scala> val df = Seq(("/Company/Engineering/DataTeam",45),("/Company/Engineering/Mobile",50)).toDF("a","b")
df: org.apache.spark.sql.DataFrame = [a: string, b: int]

scala> df.show(false)
+-----------------------------+---+
|a                            |b  |
+-----------------------------+---+
|/Company/Engineering/DataTeam|45 |
|/Company/Engineering/Mobile  |50 |
+-----------------------------+---+

scala> val udf_hier_str = udf( (x:String) => x.split('/').drop(1).scanLeft(""){(acc, next) => acc + "/" + next}.drop(1) )
udf_hier_str: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,ArrayType(StringType,true),Some(List(StringType)))

scala> df.withColumn("gen_hier",explode(udf_hier_str('a))).show(false)
+-----------------------------+---+-----------------------------+
|a                            |b  |gen_hier                     |
+-----------------------------+---+-----------------------------+
|/Company/Engineering/DataTeam|45 |/Company                     |
|/Company/Engineering/DataTeam|45 |/Company/Engineering         |
|/Company/Engineering/DataTeam|45 |/Company/Engineering/DataTeam|
|/Company/Engineering/Mobile  |50 |/Company                     |
|/Company/Engineering/Mobile  |50 |/Company/Engineering         |
|/Company/Engineering/Mobile  |50 |/Company/Engineering/Mobile  |
+-----------------------------+---+-----------------------------+


scala>
票数 0
EN

Stack Overflow用户

发布于 2020-12-23 22:33:15

另一种解决方案,没有udf()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val df = spark.sql("""
select '/Company/Engineering/DataTeam' a,45 b union
select '/Company/Engineering/Mobile',50 b
""")
df.show(false)
df.createOrReplaceTempView("df")

+-----------------------------+---+
|a                            |b  |
+-----------------------------+---+
|/Company/Engineering/DataTeam|45 |
|/Company/Engineering/Mobile  |50 |
+-----------------------------+---+

解决方案-1:使用posexplode()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spark.sql(""" 
select *, concat_ws("/",slice(split(a,"/"),1,x+1)) z from (
select a,b, posexplode(split(a,"/")) (x,y) from df
) where x<> 0
""").show(false)

+-----------------------------+---+---+-----------+-----------------------------+
|a                            |b  |x  |y          |z                            |
+-----------------------------+---+---+-----------+-----------------------------+
|/Company/Engineering/DataTeam|45 |1  |Company    |/Company                     |
|/Company/Engineering/DataTeam|45 |2  |Engineering|/Company/Engineering         |
|/Company/Engineering/DataTeam|45 |3  |DataTeam   |/Company/Engineering/DataTeam|
|/Company/Engineering/Mobile  |50 |1  |Company    |/Company                     |
|/Company/Engineering/Mobile  |50 |2  |Engineering|/Company/Engineering         |
|/Company/Engineering/Mobile  |50 |3  |Mobile     |/Company/Engineering/Mobile  |
+-----------------------------+---+---+-----------+-----------------------------+

解决方案2:使用transform()高阶函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spark.sql(""" 
select * from (
select a, b, explode_outer(z) z2 from (
select a,b, transform(split(a,"/"), (x,i) -> concat_ws("/",slice(split(a,"/"),1,i+1))  ) z from df
) ) where length(z2) > 0
""").show(false)

+-----------------------------+---+-----------------------------+
|a                            |b  |z2                           |
+-----------------------------+---+-----------------------------+
|/Company/Engineering/DataTeam|45 |/Company                     |
|/Company/Engineering/DataTeam|45 |/Company/Engineering         |
|/Company/Engineering/DataTeam|45 |/Company/Engineering/DataTeam|
|/Company/Engineering/Mobile  |50 |/Company                     |
|/Company/Engineering/Mobile  |50 |/Company/Engineering         |
|/Company/Engineering/Mobile  |50 |/Company/Engineering/Mobile  |
+-----------------------------+---+-----------------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54373706

复制
相关文章
必知|Scala类型层次结构
java的除了原始类型的所有类都有一个默认的父类Object,那么scala的统一父类是什么呢?这个是有人在群里问浪尖的一个问题,今天浪尖就给大家讲解一下Scala类型层次结构
Spark学习技巧
2020/04/27
1.2K0
SQL Server 2008使用自定义表类型
本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/04/28/1445234.html
跟着阿笨一起玩NET
2018/09/18
1.8K0
SQL Server 2008使用自定义表类型
sql server 修改表结构
文章来自http://blog.csdn.net/huwei2003/article/details/6076051
乔达摩@嘿
2020/09/11
1.9K0
管理sql server表数据_sql server如何使用
表是SQL Server中最基本的数据库对象,用于存储数据的一种逻辑结构,由行和列组成, 它又称为二维表。 例如,在学生成绩管理系统中,表1–是一个学生表(student)。
全栈程序员站长
2022/09/23
1.8K0
管理sql server表数据_sql server如何使用
springboot生成表结构和表数据sql
业务背景是需要某单机程序需要把正在进行的任务导出,然后另一台电脑上单机继续运行,我这里选择的方案是同步SQL形式,并保证ID随机,多个数据库不会重复。
程序员朱永胜
2023/08/17
2490
springboot生成表结构和表数据sql
文件层次结构
文件系统层次结构标准(英语:Filesystem Hierarchy Standard,FHS)定义了Linux操作系统中的主要目录及目录内容。在大多数情况下,它是一个传统BSD文件系统层次结构的形式化与扩充。
JNingWei
2018/09/28
9900
如何激发团队潜能?
每个技术人员最终可能都会走上管理岗位,从最初的开发 Leader、到部门负责人、甚至到 CTO,这每一个角色的转变,都需要付出巨大的努力去进行思维的转变。最近读的《授权》这本书可以让我们更好地胜任管理这个岗位。
oec2003
2020/06/23
4180
如何设计表结构
在工作中不可避免的就要针对新需求进行表结构设计, 那应该将表结构设计成什么样, 又该依据什么准则设计呢? 带着这些问题, 一起看下如何进行表结构设计. 表结构目的 我们应该带着什么样的目标, 或者说
一个架构师
2022/06/20
1.5K0
分析激发态的跃迁类型
电子激发实际是分子的电子态之间的跃迁,很多时候也理解为电子从价层分子轨道向较高能量的轨道跃迁而产生。如果跃迁到价层的空轨道,则称为价层激发;如果跃迁到能量更高的里德堡轨道,则称为里德堡激发。
用户7592569
2021/01/28
6.8K0
分析激发态的跃迁类型
SQL Server新建、修改、删除表结构。
1、点击[testdb] 2、点击[表] 3、点击[新建] 4、点击[表] 5、点击[列名] 6、点击[数据类型] 7、点击[nchar(10)] 8、点击[int] 9、点击[允许Null值] 10、点击[▲] 11、点击[设置主键] 12、点击[列名] 13、点击[数据类型] 14、点击[允许Null值] 15、点击[列名] 16、点击[数据类型] 17、点击[nchar(10)] 18、点击[int] 19、点击[文件]
裴来凡
2022/05/28
1.7K0
SQL Server新建、修改、删除表结构。
层次模型(树形结构)
在层次模型中,每个结点表示一个记录类型,每个记录类型可包含若干个字段,记录类型描述的是实体,字段描述的是实体的属性。
孙晨c
2019/10/29
2.3K0
SQL Server2008中通过SQL获取表结构
新增数据用户,角色为public,映射到待获取表结构的数据库上,授与用户在该数据库上的身份为db_owner
用户8983410
2021/11/01
1.1K0
这十二行代码是如何让浏览器爆炸的?
今天刷推特的时候发现 Cyber Security@cyber__sec 的推文让人眼前一亮:
哲洛不闹
2018/09/18
5140
这十二行代码是如何让浏览器爆炸的?
使用SQL语句创建表_用sql语句创建员工表
create table 表名 (列1 数据类型 1,列2 数据类型) tablespace 表空间
全栈程序员站长
2022/11/19
4.1K0
使用SQL语句创建表_用sql语句创建员工表
[Redis] redis的hash类型底层结构哈希表
redis hash的底层是压缩列表 和 哈希表两种形式 ,哈希表的形式是下面这样一层层嵌套的 , 转载自公众号 CodeSheep
唯一Chat
2020/12/21
8420
[Redis] redis的hash类型底层结构哈希表
sql快速创建一张相同表结构的表
根据t_bond_basic_info表,创建表结构相同的表,取老表中的一部分字段t_bond_basic_info_new 后面的条件 where id>146000 创建的时候把id>146000的数据写到新表中,如果where 1<>1,只创建表结构,不把数据写进去
周小董
2019/03/25
3K0
MS SQL SERVER导出表结构到Excel
在结果就能看到数据库所有表的结构,这个时候只要全选,然后右击出来属性框,选择将结果另存为,这个时候您只要选择导出CSV,然后新建一个Excel表格,在菜单栏选择数据,再选择自文本,后面的大家可以自己的需求自行处理了。
jamesjiang
2022/11/20
1.4K0
使用SQL-front导出MySQL表结构为excel或word文档
在撰写数据库字典结构时,需要将表结构(含注释)导出为表格(EXCEL)格式,便于提高说明文档的效率,涉及最多是数据表:
文曦
2022/06/15
3.1K0
使用SQL-front导出MySQL表结构为excel或word文档
SQL类型和Java数据类型一览表
sql type—java type数据关系 SQL Data Type JAVA Data Type bigint BIGINT binary BINARY bit BIT char CHAR datetime TIMESTAMP decimal ECIMAL float FLOAT image LONGVARBINARY int INTEGER money DECIMAL nchar CHAR ntext LONGVARCHAR numeric NUMERIC nvarchar VARCHAR real
CODER-V
2023/03/04
2840
Hive修改字段类型_hive表添加字段sql
hive修改字段类型语句:alter table 表名 change column 原字段名 新字段名 字段类型; alter table user_chain change column u_register u_registe date;(u_register原类型为string类型) 这样修改会报一个错误: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions : u_registe 原因分析:hive内部的类型转换的限制。总结为: 1、我们能够修改整型字段为double类型字段,因为double类型能够承载整型数据, 但是我们修改double类型字段为整型字段会有问题,因为整型字段不能够满足double数据 2、任何类型基本都可以转为字符串,任何double、float、int类型的数据都可以作为字符串处理 3、数据类型的转换为转换后的数据不会截断原来的数据
全栈程序员站长
2022/10/04
6.6K0

相似问题

SQL层次结构类型问题

13

类层次结构的组合爆炸

12

类层次结构爆炸式增长

119

从层次表结构构建层次顺序行

22

表中的sql层次结构

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文