簡體   English   中英

使用其他現有列 Spark/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”的新列中。

1

對於第一行,要提取的值是"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM