Объедините два набора данных искры на основе двух значений куба, исключая дубликаты

У меня есть два набора данных,

Dataset1
+---+------+------+
|cid|itemId|bought|
+---+------+------+
|abc|   123|  true|
|abc|   345|  true|
|abc|   567|  true|
|def|   123|  true|
|def|   345|  true|
|def|   567|  true|
+---+------+------+

Dataset2
+---+------+------+
|cid|itemId|bought|
+---+------+------+
|abc|   123| false|
|abc|   345| false|
|def|   789| false|
+---+------+------+

Моя цель состоит в объединении этих двух наборов данных на основе следующих критериев.

CID и ItemId формируют комбинацию (групповой ключ). Dataset2 проверяет наличие группового ключа в наборе данных1, если он присутствует, а слияние этих записей будет сброшено независимо от значения в третьем столбце.

Например, в приведенном выше примере первая и вторая строки набора данных будут удалены, и только третий столбец будет объединен.

Требуемый выходной набор данных

+---+------+------+
|cid|itemId|bought|
+---+------+------+
|abc|   123|  true|
|abc|   345|  true|
|abc|   567|  true|
|def|   123|  true|
|def|   345|  true|
|def|   567|  true|
|def|   789| false|
+---+------+------+

Это логика, которую я пытаюсь,

filter dataset2 на основе значения cid и itemid с пересечением в наборе данных1 и сохранить его как tempDataset. Но я не мог получить фильтр, который бы работал таким образом. Все еще охота за ним.

Примените left_anti join на tempDataset и dataset1 и создайте dataset3.

Хотелось бы узнать, есть ли более простой подход?

Также как фильтровать, чтобы получить tempDataset?

scala,apache-spark,apache-spark-dataset,

0

Ответов: 1


3 принят

Один из подходов будет делать unionто unionследующим образом :

import org.apache.spark.sql.functions._

val df1 = Seq(
  ("abc", 123, true),
  ("abc", 345, true),
  ("abc", 567, true),
  ("def", 123, true),
  ("def", 345, true),
  ("def", 567, true)
).toDF("cid", "itemId", "bought")

val df2 = Seq(
  ("abc", 123, false),
  ("abc", 345, false),
  ("def", 789, false)
).toDF("cid", "itemId", "bought")

df1.union( df2.join(df1, Seq("cid", "itemId"), "left_anti") ).
  show
// +---+------+------+
// |cid|itemId|bought|
// +---+------+------+
// |abc|   123|  true|
// |abc|   345|  true|
// |abc|   567|  true|
// |def|   123|  true|
// |def|   345|  true|
// |def|   567|  true|
// |def|   789| false|
// +---+------+------+
Scala, апаш-искра, апаш-искровой набор данные,
Похожие вопросы