Как вернуть только левую сторону при использовании joinWith в Scala - PullRequest
0 голосов
/ 28 февраля 2020

поэтому у меня есть следующее, и я пытаюсь использовать joinWith, и я хочу только то, что слева, а затем я хочу запустить функцию после этого соединения, я делаю следующее, но это не работает.

(для ясности, на левой стороне есть больше дополнительных столбцов в реальной жизни, поэтому я запускаю функцию после объединения, просто используя это как базовый c пример)

val df1 = Seq((1, "A1"), (2, "A2"), (3, "A3"), (4, "A4")).toDF("id", "value_left")
val df2 = Seq((3, "A3"), (4, "A4"), (4, "A4_1"), (5, "A5"), (6, "A6")).toDF("id", "value_right")

def anotherFunction(parm: Dataset[Row]): Dataset[Row]

 val transformedDf: Dataset[Row] = df1
      .joinWith(df2, df1("id")===df2("id"),"inner")
      .transform(anotherFunction)

вывод внутреннего соединения до того, как я пытаюсь получить левую сторону, выглядит следующим образом, я хочу только левую сторону в этом случае, но когда я передаю свою функцию через .transform(), он говорит, что требуется набор данных [(Row, Ряд)]

INNER JOIN
+---+----------+-----------+
| id|value_left|value_right|
+---+----------+-----------+
|  3|        A3|         A3|
|  4|        A4|       A4_1|
|  4|        A4|         A4|
+---+----------+-----------+

1 Ответ

1 голос
/ 28 февраля 2020

Если я вас правильно понял, вам не нужно фактическое соединение, но df1, отфильтрованные по идентификаторам в df2. Посмотрите на left_semi тип соединения. Если вы измените свой код на df1.joinWith(df2, df1("id")===df2("id"),"left_semi"), вы должны получить что-то вроде

LEFT SEMI JOIN
+---+----------+
| id|value_left|
+---+----------+
|  3|        A3| 
|  4|        A4|

Более подробную информацию можно найти здесь - https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-joins.html#joinWith

Кроме того, вы можно просто joined_df.drop("value_right")

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