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')

它不起作用!!

来自spark文档的报价:

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

join(other,on=None,how=None)使用给定的联接表达式。

下面执行df1和df2之间的完全外部联接。

参数:other–联接的右侧–用于联接的字符串列名、列名列表、联接表达式(column)或列列表。如果启用,则是一个字符串或字符串列表,指示联接列的名称,列必须存在于两侧,并且这执行内部等连接。how-str,默认为'inner'。一内部、外部、左外部、右外部、半联接。

>>> 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)]

因此,您需要像上一个示例中那样使用"条件作为列表"选项。

>>> 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应该是Column"

相反,我使用原始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()

报告@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')

其中CCD_ 3表示";OR";条件

您要查找的是以下

cond = [((df1.col1 == df2.col2) &
         (df1.col3 == df2.col4))]
joined_df = df1.join(df2, on = cond, how = "inner")

相关内容

  • 没有找到相关文章

最新更新