我是新的Spark Java API。我的数据集包含两列(帐户,库)。我想显示具有不同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      |

最佳答案

如果组很小,则可以使用窗口功能:

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"
)

07-24 09:53