Spark Java API, манипуляции с наборами данных?

Я новый Spark Java API. Мой набор данных содержит два столбца (аккаунт, Lib). Я хочу отображать учетные записи с разными lib. На самом деле мой набор данных примерно такой. ds1

 +---------+------------+
    |  account|    Lib     |
    +---------+------------+
    | 222222  |  bbbb      |
    | 222222  |  bbbb      |
    | 222222  |  bbbb      |
    |         |            |
    | 333333  |  aaaa      |
    | 333333  |  bbbb      |
    | 333333  |  cccc      |
    |         |            |
    | 444444  |  dddd      |
    | 444444  |  dddd      |
    | 444444  |  dddd      |
    |         |            |
    | 555555  |  vvvv      |
    | 555555  |  hhhh      |
    | 555555  |  vvvv      |

Я хочу получить ds2 вот так:

+---------+------------+
|  account|    Lib     |
+---------+------------+
|         |            |
| 333333  |  aaaa      |
| 333333  |  bbbb      |
| 333333  |  cccc      |
|         |            |
| 555555  |  vvvv      |
| 555555  |  hhhh      |
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
39
1

Ответы 1

Если группы небольшие, вы можете использовать оконные функции:

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


df
  .withColumn("cnt", approx_count_distinct("Lib").over(Window.partitionBy("account")).alias("cnt"))
  .where(col("cnt") > 1)

Если группы большие:

df.join(
  df
   .groupBy("account")
   .agg(countDistinct("Lib").alias("cnt")).where(col("cnt") > 1),
  Seq("account"),
  "leftsemi"
)

Другие вопросы по теме