比较数据框中的每一行与其他行并合并其列与

时间:2019-03-27 04:44:36

标签: java apache-spark

我有一个像

  +------+--------------+---------------+-------+---------------+
    |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             |
    +------+--------------+---------------+-------+---------------+

这是我需要做的一些事情。     

  1. 首先,我需要使用相同的帐号和相同的 person1 进行检查,如果它们匹配,我需要合并记录并汇总其金额

  2. 第二,我需要检查是否有任何 Person1 记录共享了t3中的联合帐户,这里person1- b2 共享帐户123和894。仅当b2上的金额大于10000时,才将person1 b2的这个帐号894与步骤1合并。

  3. 第三,我需要检查是否有匹配的person2,然后将它们合并到一行并求和。

注意:帐户仅适用于人员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]|
    +-------+--------+----------+-------+--------+
​
​

0 个答案:

没有答案