如何编写pyspark groupby agg函数来进行字符串比较

时间:2018-12-20 15:58:45

标签: python dataframe pyspark

我试图按记录比较两个非常大的CSV记录,并且我需要生成一个摘要矩阵以显示同一记录id的每个字段是否更改。 我的数据如下所示:

    record_id, colA, colB ....file
    10086 , 'haha', 'ok'  ....'csv1'
    10086 , 'haha', 'oh no' ....'csv2'
    10087, 'ok', 'good' ........'csv1'
    10087, 'ok', 'good' ........'csv2’

我需要获取一个如下所示的数据框:

    record_id, colA, colB ....file
    10086 , 1, 0  ….0
    10087, 1, 1 ……..0

这个想法是,我想将两个csv加载到数据帧中,创建并集并获取df_both,其中包含来自两个csvs的记录的双重条目。现在我只需要打电话

    df_both.groupBy("record_id").agg(string_comparison('colA'), string_comparison('colB') ...).show() 

生成布尔矩阵。

我只需要弄清楚如何编写string_comparison聚合函数,该函数通过每个字段检查具有相同record_id的两行,然后返回类似“ record_id,0、1、0、1 ...”的行。 / p>

使用RDD可以做到这一点,但是带有spark数据框的python的速度比RDD快,有什么办法可以实现吗?谢谢!

1 个答案:

答案 0 :(得分:0)

首先,您需要重命名列,以便在执行连接后可以区分它们。 第一次加入后,我希望得到这样的输出

record_id COLA    COLB  colA    colB
10086     haha    ok    haha    oh no
10087     ok      good  ok      good

然后您可以比较两列并获得所需的输出。

@udf
def compareCols(col1,col2):
    if col1==col2:
        return 1
    else:
        return 0
outputDF = AboveDF.withColum('compareA', compareCols(col('COLA'),col('colA'))\
                  .withColum('compareB', compareCols(col('COLB'),col('colB'))