scala - 使用其他现有列 Spark/Scala 添加新列
问题描述
我想使用其他现有列添加新列。这必须在有条件的情况下释放。这是我的 Dataframe 的一个例子:
val data = Seq(("WHT20177", "CTHT WO/MTR# : WHT20212/BTI0426; WHT20177/BTH0393"),
("WHT55637", "CTHT WO/MTR# : WHT50747/BTI2699; WHT55637/SQL1239"))
val dataFrame = data.toDF("prev_wo", "ref_wo")
+--------+-------------------------------------------------+
|prev_wo |ref_wo |
+--------+-------------------------------------------------+
|WHT20177|CTHT WO/MTR# : WHT20212/BTI0426; WHT20177/BTH0393|
|WHT55637|CTHT WO/MTR# : WHT50747/BTI2699; WHT55637/SQL1239|
+--------+-------------------------------------------------+
“ref_wo”列必须包含“prev_wo”,仅在这种情况下,我必须将以下元素放入我将命名为“col1”的新列中。
对于第一行,要提取的值是"BTH0393",对于第二行,要提取的值是"SQL1239" 我正在使用两种不同的方法在 Spark Scala 中尝试这个。第一个只对第一行有反应,第二个只对第二行有反应。
第一种方法:
def addNewColumn(df: DataFrame): DataFrame = {
val prev_wo = dataFrame.select("prev_wo").collectAsList().get(0).mkString(",")
val regex_extract = ("(?<=" + prev_wo + "\\/)(.{7})").r
df
.withColumn("col1",
when($"ref_wo".contains(col("prev_wo")),
regexp_extract(col("ref_wo"), regex_extract.toString(), 1))
.otherwise(null)
)
}
val new_dataFrame = dataFrame
.transform(addNewColumn)
输出 :
+--------+-------------------------------------------------+-------+
|prev_wo |ref_wo |col1 |
+--------+-------------------------------------------------+-------+
|WHT20177|CTHT WO/MTR# : WHT20212/BTI0426; WHT20177/BTH0393|BTH0393|
|WHT55637|CTHT WO/MTR# : WHT50747/BTI2699; WHT55637/SQL1239| |
+--------+-------------------------------------------------+-------+
第二种方法:
def addColumn(df: DataFrame): DataFrame = {
var out = df
df.collect().foreach(row => {
val prev_wo = row.getValuesMap(Seq("prev_wo")).get("prev_wo").getOrElse("")
val regex_extract = ("(?<=" + prev_wo + "\\/)(.{7})").r
out = out
.withColumn("col1",
when($"ref_wo".contains(col("prev_wo")),
regexp_extract(col("ref_wo"), regex_extract.toString(), 1))
.otherwise(null)
)
})
out
}
val new_dataFrame = dataFrame
.transform(addColumn)
输出
+--------+-------------------------------------------------+-------+
|prev_wo |ref_wo |col1 |
+--------+-------------------------------------------------+-------+
|WHT20177|CTHT WO/MTR# : WHT20212/BTI0426; WHT20177/BTH0393| |
|WHT55637|CTHT WO/MTR# : WHT50747/BTI2699; WHT55637/SQL1239|SQL1239|
+--------+-------------------------------------------------+-------+
解决方案
您可以使用从以下regexp_extract
动态生成的模式prev_wo
:
dataFrame.withColumn("col1", expr("regexp_extract(ref_wo, concat(prev_wo, '/(.{7})'), 1)")).show(false)
+--------+-------------------------------------------------+-------+
|prev_wo |ref_wo |col1 |
+--------+-------------------------------------------------+-------+
|WHT20177|CTHT WO/MTR# : WHT20212/BTI0426; WHT20177/BTH0393|BTH0393|
|WHT55637|CTHT WO/MTR# : WHT50747/BTI2699; WHT55637/SQL1239|SQL1239|
+--------+-------------------------------------------------+-------+
推荐阅读
- kubernetes - echo 容器镜像:kubernetes readinessProbe 或 livenessProbe 中的标签(URI)
- google-maps - Google Maps Geo Location Store Locator Demo 链接未在 ie11 中显示
- python - 具有多列的 Pandas 数据框条件流
- javascript - 菜单使用引导程序在移动版本中下推图像?
- python - 解决 Cassandra Coordinator 节点写入超时的方法
- java - 为消费者和生产者创建休息端点
- php - 服务器随机离线 - phpMyAdmin 中的 MySQL 各种警报问题
- javascript - 带有猫鼬的异步系列
- r - While LOOP 中的错误:需要 TRUE/FALSE 的地方缺少值
- postgresql - 将多个数组作为输入传递给 PostgreSQL 中的函数