pyspark加入多个条件

时间:2015-12-02 11:32:33

标签: join pyspark

我想问你是否知道如何指定很多条件 当我使用.join()

时pyspark

示例: 与蜂巢:

query= "select a.NUMCNT,b.NUMCNT as RNUMCNT ,a.POLE,b.POLE as RPOLE,a.ACTIVITE,b.ACTIVITE as RACTIVITE FROM rapexp201412 b \
    join rapexp201412 a where (a.NUMCNT=b.NUMCNT and a.ACTIVITE = b.ACTIVITE and a.POLE =b.POLE  )\

但是在pyspark我不知道如何制作它,因为以下内容:

df_rapexp201412.join(df_aeveh,df_rapexp2014.ACTIVITE==df_rapexp2014.ACTIVITE and df_rapexp2014.POLE==df_aeveh.POLE,'inner')

不起作用!!

4 个答案:

答案 0 :(得分:15)

引用spark docs:

https://spark.apache.org/docs/1.5.2/api/python/pyspark.sql.html?highlight=dataframe%20join#pyspark.sql.DataFrame.join

  

join(其他,on = None,how = None)使用。连接另一个DataFrame   给出连接表达式。

     

以下内容在df1和df2之间执行完全外连接。

     

参数:other - 连接的右侧 - 用于连接的字符串   列名,列名列表,连接表达式(列)或a   列列表。如果on是一个字符串或一个表示该字符串的字符串列表   连接列的名称,列必须存在于两侧,   并执行内部等连接。 how - str,默认'inner'。一   of inner,outer,left_outer,right_outer,semijoin。

>>> df.join(df2, df.name == df2.name, 'outer').select(df.name, df2.height).collect()
 [Row(name=None, height=80), Row(name=u'Alice', height=None), Row(name=u'Bob', height=85)]


>>> cond = [df.name == df3.name, df.age == df3.age]
>>> df.join(df3, cond, 'outer').select(df.name, df3.age).collect()
[Row(name=u'Bob', age=5), Row(name=u'Alice', age=2)]

所以你需要使用"条件作为列表"像上一个例子中的选项。

答案 1 :(得分:2)

>>> cond = [df.name == df3.name, df.age == df3.age]
>>> df.join(df3, cond, 'outer').select(df.name, df3.age).collect()
[Row(name=u'Bob', age=5), Row(name=u'Alice', age=2)]

这与pyspark 1.3.1无效。我得到“AssertionError:joinExprs应该是列”

相反,我使用原始sql加入数据帧,如下所示

df.registerTempTable("df")
df3.registerTempTable("df3")

sqlContext.sql("Select df.name,df3.age from df outer join df3 on df.name = df3.name and df.age =df3.age").collect()

答案 2 :(得分:1)

报告@S V Praveen 回复,因为我在加入条件中表达 OR 有问题:

cond = [df.surname == df3.surname, 
        (df.name == df3.name) | (df.age == df3.age),
        df.orders >= df3.orders ]

df.join(df3, cond, 'outer')

其中 | 代表“或”条件

答案 3 :(得分:0)

您要找的是以下内容

cond = [((df1.col1 == df2.col2) &\
         (df1.col3 == df2.col4))]

joined_df = df1.join(df2, on = cond, how = "inner")