我有一个像
+------+--------------+---------------+-------+---------------+
|tid |amount |person1 |account|person2 |
+------+--------------+---------------+-------+---------------+
|t5 |4000.0 |b2 |123 |c3 |
|t4 |12000.0 |b3 |789 |c2 |
|t1 |10000.0 |b1 |123 |c1 |
|t2 |6000.0 |b1 |123 |c1 |
|t3 |8000.0 |b2 |894 |c2 |
+------+--------------+---------------+-------+---------------+
这是我需要做的一些事情。
首先,我需要使用相同的帐号和相同的 person1 进行检查,如果它们匹配,我需要合并记录并汇总其金额
第二,我需要检查是否有任何 Person1 记录共享了t3中的联合帐户,这里person1- b2 共享帐户123和894。仅当b2上的金额大于10000时,才将person1 b2的这个帐号894与步骤1合并。
注意:帐户仅适用于人员1支票,金额不应在人员1和人员2级别重复计算。
所以我的最终输出看起来像
+--------------+--------------+---------------+------------+---------------+
|tid |amount |person1 |account |person2 |
+--------------+--------------+---------------+------------+---------------+
|[t1,t2,t5] |20000.0 |[b1,b2] |[123] |[c1,c3] |
|[t3,t4] |20000.0 |[b2,b3] |[789,894] |[c2] |
+--------------+--------------+---------------+------------+---------------+
我在第一组中对person1和数量进行了分组,在第二组中对person2进行了分组,但未能达到预期的结果,这是否有可能在这三个级别进行汇总?
这是我尝试过的方法,但是没有得到理想的结果
Dataset<Row> condAndBeneDs = txAndBeneDS.join(txAndCondDS,txAndBeneDS.col("txn_id").equalTo(txAndCondDS.col("txn_id"))).
drop(txAndCondDS.col("cash_in_amount")).
drop(txAndCondDS.col("cash_out_amount")).
drop(txAndCondDS.col("txn_date")).
drop(txAndCondDS.col("txn_id")).
//drop(txAndCondDS.col("account")).
drop(txAndBeneDS.col("txn_date")).
drop(txAndBeneDS.col("bene_tin")).
drop(txAndCondDS.col("cond_tin")).
drop(txAndCondDS.col("cash_out_amount")).
select(
txAndBeneDS.col("txn_id").as("tid"),
txAndBeneDS.col("cash_in_amount").as("amount"),
txAndBeneDS.col("bene_first_name").as("person1"),
txAndCondDS.col("account").as("account"),
txAndCondDS.col("cond_first_name").as("person2")
);
condAndBeneDs.show(false);
o/P:
+---+-------+-------+-------+-------+
|tid|amount |person1|account|person2|
+---+-------+-------+-------+-------+
|t5 |4000.0 |b2 |123 |c3 |
|t4 |12000.0|b3 |789 |c2 |
|t1 |10000.0|b1 |123 |c1 |
|t2 |6000.0 |b1 |123 |c1 |
|t3 |8000.0 |b2 |894 |c2 |
+---+-------+-------+-------+-------+
Dataset<Row> beneSet = condAndBeneDs.groupBy(condAndBeneDs.col("person1")).agg(
functions.collect_list(condAndBeneDs.col("tid")).as("tid"),
functions.collect_list(condAndBeneDs.col("account")).as("account"),
functions.sum(condAndBeneDs.col("amount")).as("amount"),
functions.collect_list(condAndBeneDs.col("person2")).as("person2")
).filter(functions.col("amount").$greater$eq("10000"));
Dataset<Row> condSet = condAndBeneDs.groupBy(condAndBeneDs.col("person2")).agg(
functions.collect_list(condAndBeneDs.col("tid")).as("tid"),
functions.collect_list(condAndBeneDs.col("account")).as("account"),
functions.sum(condAndBeneDs.col("amount")).as("amount"),
functions.collect_list(condAndBeneDs.col("person1")).as("person1")
).filter(functions.col("amount").$greater$eq("10000"));
beneSet.show(false);
+-------+--------+----------+-------+--------+
|person1|tid |account |amount |person2 |
+-------+--------+----------+-------+--------+
|b2 |[t5, t3]|[123, 894]|12000.0|[c3, c2]|
|b3 |[t4] |[789] |12000.0|[c2] |
|b1 |[t1, t2]|[123, 123]|16000.0|[c1, c1]|
+-------+--------+----------+-------+--------+
condSet.show(false);
+-------+--------+----------+-------+--------+
|person2|tid |account |amount |person1 |
+-------+--------+----------+-------+--------+
|c1 |[t1, t2]|[123, 123]|16000.0|[b1, b1]|
|c2 |[t4, t3]|[789, 894]|20000.0|[b3, b2]|
+-------+--------+----------+-------+--------+