我有一个数据框,其列的值类似于“ COR // xxxxxx-xx-xxxx”或“ xxxxxx-xx-xxxx”
我需要根据该列的值将此列与其他数据框中的另一列进行比较。
substring("column", 4, length($"column")
例如:
val DF1 = DF2.join(DF3, upper(trim($"column1".substr(4, length($"column1")))) === upper(trim(DF3("column1"))))
我不确定加入时如何添加条件。谁能告诉我如何在Spark数据框中实现这一目标?
答案 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"))))
希望这会有所帮助。