Skip to main content
 首页 » 编程设计

python spark之根据SQL中的其他数据框行IN子句过滤数据框中的行

2025年05月04日32leader

我的主数据框如下所示:

data = spark.createDataFrame([ 
      ("name1", "type1", 2),  
      ("name1", "type2", 1),  
      ("name1", "type3", 4),  
      ("name1", "type4", 5), 
      ("name2", "type1", 6),  
      ("name2", "type2", 7),  
      ("name2", "type3", 8) \ 
    ],["name", "type", "cnt"]) 
    data.printSchema() 

什么是:

|name  |type|cnt| 
|------|----------- 
|name1 |type1|  2| 
|name1 |type2|  1| 
|name1 |type3|  4| 
|name1 |type4|  5| 
|name2 |type1|  7| 
|name2 |type2|  8| 
| .... | ... |   |   

然后还有两个我想用来过滤主 DF 的数据帧:

df_name = spark.createDataFrame([ 
      ("name1"),  
    ],["name"]) 
    data.printSchema() 
 
 
df_type = spark.createDataFrame([ 
      ("type1"),   
      ("type3") 
    ],["type"]) 
    data.printSchema() 

我想选择 df1 中具有 name IN df_name 和 type in df_type 的所有行。 类似于 SQL 中 in 子句的作用

SELECT * from df1 
WHERE name in ('name1')  
AND type IN ('type1', 'type3'); 

什么应该导致 2 行:

|name  |type|cnt| 
|------|----------- 
|name1 |type1|  2| 
|name1 |type3|  4| 

如何使用 spark dataFrames 以高效的方式完成,性能是否比在 Hive 中更好?

谢谢

请您参考如下方法:

您可以将 data 与 type 和 name 数据框进行内部连接:

data.join(df_type, ["type"], "inner").join(df_name, ["name"], "inner").show() 
 
+-----+-----+---+ 
| name| type|cnt| 
+-----+-----+---+ 
|name1|type3|  4| 
|name1|type1|  2| 
+-----+-----+---+