Подстрока столбца данных в зависимости от значения во время объединения - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть фрейм данных со столбцом, имеющим такие значения, как "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 голосов
/ 14 ноября 2018

Вы можете попробовать добавить новый столбец в зависимости от условий и присоединиться к новому столбцу. Как то так.

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"))))

Надеюсь, это поможет.

0 голосов
/ 14 ноября 2018

Просто создайте новый столбец для использования в 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.

...