![](/img/trans.png)
[英]Adding new Columns based on aggregation on existing column in Spark DataFrame using scala
[英]Adding new column using other existing columns 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)
OUTPUT:
+--------+-------------------------------------------------+-------+
|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)
OUTPUT
+--------+-------------------------------------------------+-------+
|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|
+--------+-------------------------------------------------+-------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.