数据框列子字符串基于连接期间的值

时间:2018-11-14 05:16:23

标签: scala apache-spark dataframe join apache-spark-sql

我有一个数据框,其列的值类似于“ COR // xxxxxx-xx-xxxx”或“ xxxxxx-xx-xxxx”

我需要根据该列的值将此列与其他数据框中的另一列进行比较。

  1. 如果列值具有“ COR // xxxxx-xx-xxxx”,则我需要使用substring("column", 4, length($"column")
  2. 如果列值具有“ xxxxx-xx-xxxx”,则可以直接比较而无需使用子字符串。

例如:

val DF1 = DF2.join(DF3, upper(trim($"column1".substr(4, length($"column1")))) === upper(trim(DF3("column1"))))

我不确定加入时如何添加条件。谁能告诉我如何在Spark数据框中实现这一目标?

2 个答案:

答案 0 :(得分:0)

只需创建一个新列即可在join中使用:

DF2.withColumn("column2", 
  when($"column1" rlike "COR//.*", 
    $"column1".substr(lit(4), length($"column1")).
  otherwise($"column1"))

然后在column2中使用join。也可以直接在when中添加整个join子句,但是看起来很混乱。

请注意,要在substr中使用常量,您需要使用lit。如果要删除整个“ COR //”部分,请使用6而不是4。

答案 1 :(得分:0)

您可以尝试根据条件添加新列并加入新列。像这样的东西。

val data = List("COR//xxxxx-xx-xxxx", "xxxxx-xx-xxxx")
val DF2 = ps.sparkSession.sparkContext.parallelize(data).toDF("column1")
val DF4 = DF2.withColumn("joinCol", when(col("column1").like("%COR%"),
  expr("substring(column1, 6, length(column1)-1)")).otherwise(col("column1")) )

DF4.show(false)

新列将具有这样的值。

+------------------+-------------+
|column1           |joinCol      |
+------------------+-------------+
|COR//xxxxx-xx-xxxx|xxxxx-xx-xxxx|
|xxxxx-xx-xxxx     |xxxxx-xx-xxxx|
+------------------+-------------+

您现在可以根据添加的新列加入。

val DF1 = DF4.join(DF3, upper(trim(DF4("joinCol"))) === upper(trim(DF3("column1"))))

希望这会有所帮助。