Spark API: используйте значение столбца в операторе LIKE - PullRequest
0 голосов
/ 10 июня 2019

В API свечей:

column.like("only takes a static string with optional wildcards like %")
column.contains(accepts_a_column_but_wont_parse_wildcards)

Так какой же метод вызывается для сравнения значений с использованием подстановочных знаков, которые могут отображаться в строковом значении из столбца, найденного в соединении?

пример, который терпит неудачу, потому что like () принимает литеральные строки, а не Column:

.join(other_df, column.like(concat("%", $"column_potentially_with_wildcards", "%")), "left")

1 Ответ

1 голос
/ 10 июня 2019

Глядя на код, like(), кажется, принимает только буквальное значение для удобства.Надеюсь, они расширят это в будущем выпуске, но сейчас вы можете создать свою собственную функцию компенсации:

import org.apache.spark.sql.catalyst.expressions.Like
import org.apache.spark.sql.Column

def columnLike(a : Column, b : Column) : Column = new Column( Like(a.expr, b.expr))

...

scala> val df1 = List("aaaa", "bbbb", "aaaabbbbcccc", "abcd", "abc").toDS()
df1: org.apache.spark.sql.Dataset[String] = [value: string]

scala> val df2 = List("a%b%c").toDS()
df2: org.apache.spark.sql.Dataset[String] = [value: string]

scala> df1.join(df2, columnLike(df1("value"), df2("value"))).show
+------------+-----+                                                            
|       value|value|
+------------+-----+
|aaaabbbbcccc|a%b%c|
|         abc|a%b%c|
+------------+-----+


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...