Skip to main content
 首页 » 编程设计

python之在 PySpark 中提取特定行

2025年05月04日64itcoder

我有这样一个数据框

data = [(("ID1", "A", 1)), (("ID1", "B", 5)), (("ID2", "A", 12)),  
       (("ID3", "A", 3)), (("ID3", "B", 3)), (("ID3", "C", 5)), (("ID4", "A", 10))] 
df = spark.createDataFrame(data, ["ID", "Type", "Value"]) 
df.show() 
 
+---+----+-----+ 
| ID|Type|Value| 
+---+----+-----+ 
|ID1|   A|    1| 
|ID1|   B|    5| 
|ID2|   A|   12| 
|ID3|   A|    3| 
|ID3|   B|    3| 
|ID3|   C|    5| 
|ID4|   A|   10| 
+---+----+-----+ 

我只想提取那些只包含一个特定类型 - “A”的行(或 ID)

因此我预期的输出将包含以下行

+---+----+-----+ 
| ID|Type|Value| 
+---+----+-----+ 
|ID2|   A|    1| 
|ID4|   A|   10| 
+---+----+-----+ 

每个 ID 都可以包含任何类型 - A、B、C 等。我想提取那些只包含一个类型 - 'A' 的 ID

我如何在 PySpark 中实现这一点

请您参考如下方法:

您可以对其应用过滤器。

import pyspark.sql.functions as f 
 
data = [(("ID1", "A", 1)), (("ID1", "B", 5)), (("ID2", "A", 12)),  
       (("ID3", "A", 3)), (("ID3", "B", 3)), (("ID3", "C", 5)), (("ID4", "A", 10))] 
df = spark.createDataFrame(data, ["ID", "Type", "Value"]) 
df.show() 
 
+---+----+-----+ 
| ID|Type|Value| 
+---+----+-----+ 
|ID1|   A|    1| 
|ID1|   B|    5| 
|ID2|   A|   12| 
|ID3|   A|    3| 
|ID3|   B|    3| 
|ID3|   C|    5| 
|ID4|   A|   10| 
+---+----+-----+ 
 
x= df.filter(f.col('Type')=='A') 
 
x.show() 
 

如果我们需要过滤所有只有一条记录的 ID,并且类型也是“A”,那么下面的代码可能是解决方案

 
df.registerTempTable('table1') 
 
 
sqlContext.sql('select a.ID, a.Type,a.Value from table1 as a, (select ID, count(*) as cnt_val from table1 group by ID) b where a.ID = b.ID and (a.Type=="A" and b.cnt_val ==1)').show() 
 
 
+---+----+-----+ 
| ID|Type|Value| 
+---+----+-----+ 
|ID2|   A|   12| 
|ID4|   A|   10| 
+---+----+-----+ 
 
 

会有更好的替代方法来找到相同的。