У меня есть датафрейм, как
+------+--------------+---------------+-------+---------------+
|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's , если они совпадают, мне нужно объединить записи и сложить их сумму
Во-вторых, мне нужно проверить, если какие-либо записи Person1 делят общий счет, как в t3, здесь person1 - b2 разделяет счета 123 и 894. Объедините этот номер счета 894 лица person1 b2 с Step1, только если сумма на b2 превышает 10000.
- В-третьих, мне нужно проверить, есть ли совпадающие лица 2, затем мне нужно объединить их в один ряд и суммировать суммы.
Примечание. Учетная запись применима только для чеков person1, а суммы не должны учитываться дважды на уровне person1 и person2.
Итак, мой окончательный результат будет выглядеть
+--------------+--------------+---------------+------------+---------------+
|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 и количеству в первом сете и group by по 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]|
+-------+--------+----------+-------+--------+
1038 *