在不使用 spark.sql() 的情况下在 spark scala 中分组和聚合数据集

Group and aggregate dataset in spark scala without using spark.sql()

我有一个包含客户帐户信息的数据集,如下所示

customerID accountID balance
ID001 ACC001 20
ID002 ACC002 400
ID003 ACC003 500
ID002 ACC004 30

我想分组并聚合上述数据以获得如下输出而不使用 spark.sql 函数,而是允许使用数据集 API

accounts number of accounts totalBalance averageBalance
[ID001,ACC001,20] 1 20 20
[[ID002,ACC002,400], [ID002,ACC004,30]] 2 430 215
[ID003,ACC003,500] 1 500 500

我尝试使用 ds.groupBy("accountID").agg(Map("balance" -> "avg")),但是我只能使用 Map 函数来获取平均值。需要帮助在不使用 spark sql 函数的情况下进行多重聚合。

感谢任何有助于实现上述解决方案的帮助。谢谢

这是您的解决方案


val cust_data = Seq[(String, String, Int)](
("ID001",   "ACC001",   20),
("ID002",   "ACC002",   400),
("ID003",   "ACC003",   500),
("ID002",   "ACC004",   30)).toDF("customerID", "accountID",    "balance")

val out_df = cust_data.groupBy("customerID").agg(count($"accountID").alias("number_of_accounts"),
                                   sum($"balance").alias("totalBalance"),
                                   avg($"balance").alias("averageBalance"))

                                    
out_df.show()

+----------+------------------+------------+--------------+
|customerID|number_of_accounts|totalBalance|averageBalance|
+----------+------------------+------------+--------------+
|     ID001|                 1|          20|          20.0|
|     ID002|                 2|         430|         215.0|
|     ID003|                 1|         500|         500.0|
+----------+------------------+------------+--------------+