PySpark:将DataFrame列的值与另一个DataFrame列进行匹配

20
在Pandas DataFrame中,我可以使用 DataFrame.isin() 函数将列值与另一列进行匹配。
例如:假设我们有一个DataFrame:
df_A = pd.DataFrame({'col1': ['A', 'B', 'C', 'B', 'C', 'D'], 
                     'col2': [1, 2, 3, 4, 5, 6]})
df_A

    col1  col2
0    A     1
1    B     2
2    C     3
3    B     4
4    C     5
5    D     6         

另一个数据帧:

df_B = pd.DataFrame({'col1': ['C', 'E', 'D', 'C', 'F', 'G', 'H'], 
                     'col2': [10, 20, 30, 40, 50, 60, 70]})
df_B

    col1  col2
0    C    10
1    E    20
2    D    30
3    C    40
4    F    50
5    G    60
6    H    70       

我可以使用.isin()函数将df_B的列值与df_A的列值进行匹配。
例如:
df_B[df_B['col1'].isin(df_A['col1'])]

产生以下结果:
    col1  col2
0    C    10
2    D    30
3    C    40

在 PySpark DataFrame 中,什么是等效的操作?

df_A = pd.DataFrame({'col1': ['A', 'B', 'C', 'B', 'C', 'D'], 
                     'col2': [1, 2, 3, 4, 5, 6]})
df_A = sqlContext.createDataFrame(df_A)

df_B = pd.DataFrame({'col1': ['C', 'E', 'D', 'C', 'F', 'G', 'H'], 
                     'col2': [10, 20, 30, 40, 50, 60, 70]})
df_B = sqlContext.createDataFrame(df_B)


df_B[df_B['col1'].isin(df_A['col1'])]

.isin() 代码导致错误消息:

u'resolved attribute(s) col1#9007 missing from 
col1#9012,col2#9013L in operator !Filter col1#9012 IN 
(col1#9007);;\n!Filter col1#9012 IN (col1#9007)\n+- 
LogicalRDD [col1#9012, col2#9013L]\n'
1个回答

44

在Spark中,这种操作被称为左半连接:

df_B.join(df_A, ['col1'], 'leftsemi')

如果它们有不同的列名,会怎么样? - Blue Clouds
1
@BlueClouds 在这种情况下,您只需修改连接条件:df_B.join(df_A, [df_B.col1 == db_A.col2], 'leftsemi') - Mariusz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接