在不使用 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|
+----------+------------------+------------+--------------+
我有一个包含客户帐户信息的数据集,如下所示
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|
+----------+------------------+------------+--------------+