Python 3.x 如何比较PySpark数据帧中的记录

Python 3.x 如何比较PySpark数据帧中的记录,python-3.x,pyspark,apache-spark-sql,Python 3.x,Pyspark,Apache Spark Sql,我想比较2个数据帧,我想根据以下3个条件提取记录 如果记录匹配,“SAME”应该出现在新的列标志中 如果记录不匹配,如果它来自df1(假设编号66),“df1”应该出现在标志列中 如果记录不匹配,如果它来自df2(假设编号77),“df2”应该出现在标志列中。 这里整个记录需要考虑和验证。按记录进行比较。 我还需要像这样使用PySpark代码检查数百万条记录 df1: No,Name,Sal,Address,Dept,Join_Date 11,Sam,1000,ind,IT,2/11/2019

我想比较2个数据帧,我想根据以下3个条件提取记录

  • 如果记录匹配,“SAME”应该出现在新的列标志中
  • 如果记录不匹配,如果它来自df1(假设编号66),“df1”应该出现在标志列中
  • 如果记录不匹配,如果它来自df2(假设编号77),“df2”应该出现在标志列中。 这里整个记录需要考虑和验证。按记录进行比较。
    我还需要像这样使用PySpark代码检查数百万条记录
  • df1:

    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3500,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Vom,5000,mex,IT,2/11/2019
    66,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3000,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Xom,5000,mex,IT,2/11/2019
    77,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date,FLAG
    11,Sam,1000,ind,IT,2/11/2019,SAME
    22,Tom,2000,usa,HR,2/11/2019,SAME
    33,Kom,3500,uk,IT,2/11/2019,DF1
    33,Kom,3000,uk,IT,2/11/2019,DF2
    44,Nom,4000,can,HR,2/11/2019,SAME
    55,Vom,5000,mex,IT,2/11/2019,DF1
    55,Xom,5000,mex,IT,2/11/2019,DF2
    66,XYZ,5000,mex,IT,2/11/2019,DF1
    77,XYZ,5000,mex,IT,2/11/2019,DF2
    
    df2:

    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3500,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Vom,5000,mex,IT,2/11/2019
    66,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3000,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Xom,5000,mex,IT,2/11/2019
    77,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date,FLAG
    11,Sam,1000,ind,IT,2/11/2019,SAME
    22,Tom,2000,usa,HR,2/11/2019,SAME
    33,Kom,3500,uk,IT,2/11/2019,DF1
    33,Kom,3000,uk,IT,2/11/2019,DF2
    44,Nom,4000,can,HR,2/11/2019,SAME
    55,Vom,5000,mex,IT,2/11/2019,DF1
    55,Xom,5000,mex,IT,2/11/2019,DF2
    66,XYZ,5000,mex,IT,2/11/2019,DF1
    77,XYZ,5000,mex,IT,2/11/2019,DF2
    
    预期输出:

    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3500,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Vom,5000,mex,IT,2/11/2019
    66,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date
    11,Sam,1000,ind,IT,2/11/2019
    22,Tom,2000,usa,HR,2/11/2019
    33,Kom,3000,uk,IT,2/11/2019
    44,Nom,4000,can,HR,2/11/2019
    55,Xom,5000,mex,IT,2/11/2019
    77,XYZ,5000,mex,IT,2/11/2019
    
    No,Name,Sal,Address,Dept,Join_Date,FLAG
    11,Sam,1000,ind,IT,2/11/2019,SAME
    22,Tom,2000,usa,HR,2/11/2019,SAME
    33,Kom,3500,uk,IT,2/11/2019,DF1
    33,Kom,3000,uk,IT,2/11/2019,DF2
    44,Nom,4000,can,HR,2/11/2019,SAME
    55,Vom,5000,mex,IT,2/11/2019,DF1
    55,Xom,5000,mex,IT,2/11/2019,DF2
    66,XYZ,5000,mex,IT,2/11/2019,DF1
    77,XYZ,5000,mex,IT,2/11/2019,DF2
    
    我像下面这样加载了输入数据,但不知道如何继续

    df1 = pd.read_csv("D:\\inputs\\file1.csv")
    
    df2 = pd.read_csv("D:\\inputs\\file2.csv")
    
    感谢您的帮助。谢谢。

    我认为您可以通过创建临时列来指示源和一个
    连接来解决您的问题。然后,您只需检查条件,即是否存在两个源,或者是否只有一个源,以及是哪一个源

    考虑以下代码:

    从pyspark.sql.functions导入*
    df1=sqlContext.createDataFrame([(11,'Sam',1000,'ind','IT','2/11/2019')\
    (22,'Tom',2000,'usa','HR','2019年11月2日'),(33,'Kom',3500,'uk','IT','2019年11月2日')\
    (44,'Nom',4000,'can','HR','2019年11月2日'),(55,'Vom',5000,'mex','IT','2019年11月2日')\
    (66,'XYZ',5000,'mex','IT','2019年11月2日')\
    [“编号”、“姓名”、“Sal”、“地址”、“部门”、“加入日期”])
    df2=sqlContext.createDataFrame([(11,'Sam',1000,'ind','IT','2/11/2019')\
    (22,'Tom',2000,'usa','HR','2019年11月2日'),(33,'Kom',3000,'uk','IT','2019年11月2日')\
    (44,'Nom',4000,'can','HR','2019年11月2日'),(55,'Xom',5000,'mex','IT','2019年11月2日')\
    (77,'XYZ',5000,'mex','IT','2019年11月2日')\
    [“编号”、“姓名”、“Sal”、“地址”、“部门”、“加入日期”])
    #创建示例数据帧
    df1=df1。带列(“源1”,亮起(“df1”))
    df2=df2。带列(“源2”,亮起(“df2”))
    #用于稍后引用原点的临时列
    df1.加入(df2,[“编号”、“姓名”、“Sal”、“地址”、“部门”、“加入日期”、“全部”)\
    #所有列上的完全联接,但仅当记录出现在原始数据帧中时才设置源\
    .withColumn(“标志”,当(col(“Source1”).isNotNull()和col(“Source2”).isNotNull(),“相同”)\
    #如果记录出现在两个数据帧中,则为条件\
    。否则(当(col(“Source1”).isNotNull(),“DF1”)。否则(“DF2”))\
    #如果记录出现在一个数据帧中,则为条件\
    .drop(“Source1”、“Source2”).show()#删除临时列并显示结果
    
    输出:

    +---+----+----+-------+----+---------+----+
    |无|姓名| Sal |地址|部门|加入|日期|标志|
    +---+----+----+-------+----+---------+----+
    |33 | Kom | 3000 |英国| IT | 2019年11月2日| DF2|
    |44 | Nom | 4000 | can | HR | 2019年11月2日|相同|
    |22 |汤姆| 2000 |美国| HR | 2019年11月2日|相同|
    |77 | XYZ | 5000 |墨西哥| IT | 2019年11月2日| DF2|
    |55 | Xom | 5000 | mex | IT | 2/11/2019 | DF2|
    |11 | Sam | 1000 | ind | IT | 2019年11月2日|相同|
    |66 | XYZ | 5000 |墨西哥| IT | 2019年11月2日| DF1|
    |55 | Vom | 5000 | mex | IT | 2019年11月2日| DF1|
    |33 | Kom | 3500 |英国| IT | 2019年11月2日| DF1|
    +---+----+----+-------+----+---------+----+
    
    使用函数检查相同行的计数是否大于1,如果确实大于1,则将列
    标记为
    相同
    ,否则保持不变。最后,删除重复项

    my_window = Window.partitionBy('No','Name','Sal','Address','Dept','Join_Date').rowsBetween(-sys.maxsize, sys.maxsize)
    df = df.withColumn('FLAG', when((count('*').over(my_window) > 1),'SAME').otherwise(col('FLAG'))).dropDuplicates()
    df.show()
    +---+----+----+-------+----+---------+----+
    | No|Name| Sal|Address|Dept|Join_Date|FLAG|
    +---+----+----+-------+----+---------+----+
    | 33| Kom|3000|     uk|  IT|2/11/2019| DF2|
    | 44| Nom|4000|    can|  HR|2/11/2019|SAME|
    | 22| Tom|2000|    usa|  HR|2/11/2019|SAME|
    | 77| XYZ|5000|    mex|  IT|2/11/2019| DF2|
    | 55| Xom|5000|    mex|  IT|2/11/2019| DF2|
    | 11| Sam|1000|    ind|  IT|2/11/2019|SAME|
    | 66| XYZ|5000|    mex|  IT|2/11/2019| DF1|
    | 55| Vom|5000|    mex|  IT|2/11/2019| DF1|
    | 33| Kom|3500|     uk|  IT|2/11/2019| DF1|
    +---+----+----+-------+----+---------+----+
    

    你把进口货物包括在内了吗<代码>从pyspark.sql.functions导入*
    之后,通常您应该能够在列上调用isNotNull()。您还可以使用
    替换条件。使用列(“标志”,当((列(“源1”)=“DF1”)和(列(“源2”)=“DF2”),“相同”)。否则(列(“源1”)=“DF1”,“DF1”)。否则(“DF2”)
    ,它现在不检查null,但检查origin。您可能不需要sqlContext,因为您在读取文件时创建了数据帧。我只是用它来创建示例作为数据帧。很抱歉耽误您的时间:这次获取:AttributeError:'str'对象没有属性'equalTo'。现在使用下面的语句:df1.join(df2,[“No”,“Name”,“Sal”,“Address”,“Dept”,“join_Date”],“full”).withColumn(“FLAG”),when((col(“Source1”)==“df1”)&(col(“Source2”)==“df2”),“SAME”)。否则(col(“Source1”).isNotNull(),“df1”)。drop(“Source1”,“Source2”)。如果我只是复制此代码,则显示()奇怪,我可以执行它并得到期望的结果。我的猜测是,
    col
    函数不能正常工作,因为它应该返回特定的列而不是字符串。如果导入是正确的,这可能类似于pyspark.sql.functions import lit,col中的
    ,当
    时,那么它似乎取决于您的运行时环境。您可以尝试将列引用为
    df1.Source1
    ,等等。但是,现在您必须将联接结果分配给一个变量,这个解决方案对我来说非常有效。早些时候,我不理解窗口函数。即使对于数百万张唱片来说,这也是极好的。另一种解决方案也很好,但在处理海量数据时,发现问题很少。非常感谢。@cph_sto,对于50多个栏目,您有什么建议?与其输入列的名称,不如为50多个列推荐什么?而不是键入列的名称@RKSize是什么?python中可能的最大值是多少