Объединение двух DataFrames в Spark SQL и выбор столбцов только одного

У меня есть два DataFrames в Spark SQL (D1 и D2).

Я пытаюсь внутренне объединить их D1.join(D2, "some column") и получить обратно данные только D1, а не полного набора данных.

И D1, и D2 имеют одинаковые столбцы.

Может ли кто-нибудь помочь мне в этом?

Я использую Spark 1.6.


person Avi    schedule 02.08.2016    source источник


Ответы (4)


Допустим, вы хотите присоединиться к столбцу «id». Тогда вы могли бы написать:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._    
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select($"d1.*")
person cheseaux    schedule 02.08.2016
comment
Привет, этот ответ помогает. У меня глупый вопрос. Что означает знак $? Я получаю сообщение об ошибке, когда пытаюсь ввести знак $ в свой код. - person Avi; 02.08.2016
comment
Это альтернативный способ доступа к столбцам DataFrame, как описано в здесь, но вам нужно импортировать имплицитный пакет (я отредактировал свой ответ) - person cheseaux; 02.08.2016
comment
Что ж, есть вариант соединения с левым полушарием. Он включает строки из левой таблицы, у которых есть соответствующая строка справа. Также нет необходимости выполнять дедупликацию, поскольку соответствующие строки включаются только один раз. - person user238607; 02.10.2017

В качестве альтернативного ответа вы также можете сделать следующее, не добавляя псевдонимы:

d1.join(d2, d1("id") === d2("id"))
  .select(d1.columns.map(c => d1(c)): _*)
person nsanglar    schedule 30.01.2018
comment
Привет, @nsanglar, спасибо, это было очень полезно. Однако, если у меня есть производный столбец, например .withColumn("derived_id", coalesce(d2("id"),d1("id"))), и я хочу, чтобы этот столбец вместе со всеми столбцами d1, то как я могу изменить оператор select? - person riyaB; 04.06.2020

Вы можете использовать left_semi:

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left_semi")

Полусоединение берет только строки из левого набора данных, в которых выполнено условие соединения.

Есть еще один интересный тип соединения: left_anti, который работает аналогично left_semi, но принимает только те строки, где условие не выполняется.

person Krzysztof Atłasik    schedule 30.05.2019

Вы должны использовать соединение leftsemi, которое похоже на различие внутреннего соединения, поскольку соединение leftsemi возвращает все столбцы из левого набора данных и игнорирует все столбцы из правого набора данных.

Вы можете попробовать что-то подобное в Scala, чтобы присоединиться к Spark DataFrame с помощью leftsemi типы соединения.

empDF.join(deptDF,empDF("emp_dept_id") ===  deptDF("dept_id"),"leftsemi")
    .show(false)

Если вы используете Python, используйте приведенный ниже пример PySpark join dataframe

empDF.join(deptDF,empDF.emp_dept_id ==  deptDF.dept_id,"leftsemi") \
   .show(truncate=False)
person Kumar    schedule 27.10.2020