Spark与SQL之间NB的转换_withClumn,split及SubString

业务描述

业务中有这样一个场景,我想实现的是将dataframe表table1中的字段b1与c1的内容使用下划线_连接起来列的名字为d1,比如比如学习_1,睡觉_2,吃饭_3,这是我的第一个需求;随后我想保留的是dataframe表table1中的字段d1中的数据比如学习_1,睡觉_2,吃饭_3,中的数据中_前后的数据分别作为两列e1,f1。

该怎么写这个spark代码,我的想法是使用withclumn函数及split函数.sql来写的话就是使用subString函数来进行_匹配。

为什么要这么做,因为单独的b1列是一个目标的id,而b2是作为每天不同时间段传过来数据的批号,一批一批的实时数据过来,一个目标一天内对应许多个批次数据,批次的名称是单独不重复的。为了后面做类别,先把目标,批次联合在一起,做一个联合 '目标_批次',然后再把目标,批次拆开供后面的聚合使用。

比如说

sql代码

sql 复制代码
SELECT SUBSTRING_INDEX(a1, '_', 1) AS a2
FROM table1;

Spark代码

创建一个DataFrame,名为table1,将b1c1字段的内容使用下划线连接起来,并将新的列命名为d1

Scala 复制代码
import org.apache.spark.sql.functions._  
  
val table1 = Seq(  
  ("学习", "1"),  
  ("睡觉", "2"),  
  ("吃饭", "3")  
).toDF("b1", "c1")  
  
val table1_d1 = table1.withColumn("d1", concat($"b1", "_", $"c1"))

使用split函数将d1字段中的数据拆分为两列e1f1

Scala 复制代码
val table1_d1_split = table1_d1.withColumn("e1", split(col("d1"), "_")(0))  
                               .withColumn("f1", split(col("d1"), "_")(1))

table1_d1_split.show()

table1_d1_split DataFrame将包含新的列e1f1,分别包含下划线前后的数据

Scala 复制代码
+------+------+------+------+------+  
|   b1 |   c1 |   d1 |   e1 |   f1 |  
+------+------+------+------+------+  
| 学习 |   1  | 学习_1 | 学习 |   1  |  
| 睡觉 |   2  | 睡觉_2 | 睡觉 |   2  |  
| 吃饭 |   3  | 吃饭_3 | 吃饭 |   3  | 

sql的就是不断地截取

整体的处理这块逻辑代码:

Scala 复制代码
import org.apache.spark.sql.functions._  
  
val table1 = Seq(  
  ("学习", "1"),  
  ("睡觉", "2"),  
  ("吃饭", "3")  
).toDF("b1", "c1")  
  
val table1_d1 = table1.withColumn("d1", concat($"b1", "_", $"c1"))
val table1_d1_split = table1_d1.withColumn("e1", split(col("d1"), "_")(0))  
                               .withColumn("f1", split(col("d1"), "_")(1))

table1_d1_split.show()
相关推荐
windfantasy19901 小时前
编程考级体系:覆盖全学段多科目的优势分析
大数据
wheelerer5 小时前
企业营销的隐形门槛:当规则成为第一道城墙
大数据·营销·流量营销
跨境猫小妹6 小时前
亚马逊合规新纪元:隐形战场里,谁在悄悄出局?
大数据·人工智能·产品运营·跨境电商·防关联
玄微云6 小时前
AI智能体开发公司推荐:玄微科技专注垂直场景的实践者
大数据·人工智能·软件需求
数据智研7 小时前
【数据分享】腾格里沙漠空间矢量范围
大数据·信息可视化·数据分析
智能化咨询8 小时前
(68页PPT)埃森哲XX集团用户主数据治理项目汇报方案(附下载方式)
大数据·人工智能
卿雪9 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang
数据智研9 小时前
【数据分享】毛乌素沙地(毛乌素沙漠)空间矢量范围
大数据·人工智能·信息可视化·数据分析
TinpeaV9 小时前
Elasticsearch8(ES)保姆级菜鸟入门教程
大数据·spring boot·elasticsearch·搜索引擎·全文检索·postman
专注数据的痴汉9 小时前
「数据获取」江门统计年鉴(1997-2024)
大数据·人工智能·信息可视化