pyspark加入多个条件

mal*_*uke 9 apache-spark pyspark

我想问一下,当我使用.join()时,你是否知道如何在pyspark中指定很多条件

示例:with hive:

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  )\
Run Code Online (Sandbox Code Playgroud)

但是在pyspark我不知道怎么做,因为以下内容:

df_rapexp201412.join(df_aeveh,df_rapexp2014.ACTIVITE==df_rapexp2014.ACTIVITE and df_rapexp2014.POLE==df_aeveh.POLE,'inner')
Run Code Online (Sandbox Code Playgroud)

不起作用!!

use*_*574 16

引用spark文档:

(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 - 连接的右侧 - 用于连接列名的字符串,列名列表,连接表达式(列)或列列表.如果on是字符串或指示连接列名称的字符串列表,则列必须存在于两侧,并且这将执行内部等连接.how - str,默认'inner'.内部,外部,left_outer,right_outer,半连接之一.

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `cond = [(df.name == df3.name) | (df.age == df3.age)]` 代替,其中 `|` 表示“或”条件。 (4认同)
  • 这个 cond = [df.name == df3.name, df.age == df3.age] 意味着“和”还是“或”?如果我想要 df.name == df1.name 或 df.age == df1.age 该怎么办?那会怎样呢? (3认同)

Vzz*_*arr 9

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

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

df.join(df3, cond, 'outer')
Run Code Online (Sandbox Code Playgroud)

其中|代表“OR”条件


Moh*_*han 6

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

这不适用于 pyspark 1.3.1。我收到“断言错误: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()
Run Code Online (Sandbox Code Playgroud)