业务描述
业务中有这样一个场景,我想实现的是将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代码
SELECT SUBSTRING_INDEX(a1, '_', 1) AS a2
FROM table1;
Spark代码
创建一个DataFrame,名为table1
,将b1
和c1
字段的内容使用下划线连接起来,并将新的列命名为d1
:
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
字段中的数据拆分为两列e1
和f1
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将包含新的列e1
和f1
,分别包含下划线前后的数据
+------+------+------+------+------+
| b1 | c1 | d1 | e1 | f1 |
+------+------+------+------+------+
| 学习 | 1 | 学习_1 | 学习 | 1 |
| 睡觉 | 2 | 睡觉_2 | 睡觉 | 2 |
| 吃饭 | 3 | 吃饭_3 | 吃饭 | 3 |
sql的就是不断地截取
整体的处理这块逻辑代码:
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()