Python 3.x 如何比较PySpark数据帧中的记录
我想比较2个数据帧,我想根据以下3个条件提取记录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
我还需要像这样使用PySpark代码检查数百万条记录
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中可能的最大值是多少