Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python在Spark中执行两个RDD表的基本联接?_Python_Join_Apache Spark_Pyspark_Rdd - Fatal编程技术网

如何使用Python在Spark中执行两个RDD表的基本联接?

如何使用Python在Spark中执行两个RDD表的基本联接?,python,join,apache-spark,pyspark,rdd,Python,Join,Apache Spark,Pyspark,Rdd,如何使用python在Spark中执行基本联接?在R中,可以使用merg()来实现这一点。在spark上使用python的语法是什么: 内连接 左外连接 交叉连接 有两个表(RDD),每个表中有一列,并且有一个公共键 RDD(1):(key,U) RDD(2):(key,V) 我认为内部连接是这样的: rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs)); 是这样吗?我在互联网上搜索过,没有找到一个好的连接示例。提前感谢。可以

如何使用python在Spark中执行基本联接?在R中,可以使用merg()来实现这一点。在spark上使用python的语法是什么:

  • 内连接
  • 左外连接
  • 交叉连接
  • 有两个表(RDD),每个表中有一列,并且有一个公共键

    RDD(1):(key,U)
    RDD(2):(key,V)
    
    我认为内部连接是这样的:

    rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs));
    

    是这样吗?我在互联网上搜索过,没有找到一个好的连接示例。提前感谢。

    可以使用
    pairdd函数
    或Spark数据帧来完成。由于数据帧操作受益于第二个选项,因此值得考虑

    假设您的数据如下所示:

    rdd1 =  sc.parallelize([("foo", 1), ("bar", 2), ("baz", 3)])
    rdd2 =  sc.parallelize([("foo", 4), ("bar", 5), ("bar", 6)])
    
    使用PAIRDDS: 内部联接:

    rdd1.join(rdd2)
    
    左外连接:

    rdd1.leftOuterJoin(rdd2)
    
    df1.join(df2, df1.k == df2.k, how='left_outer')
    spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')
    
    笛卡尔积(不需要
    RDD[(t,U)]
    ):

    广播连接(不需要
    RDD[(t,U)]
    ):

    最后还有
    cogroup
    ,它没有直接的SQL等价物,但在某些情况下很有用:

    cogrouped = rdd1.cogroup(rdd2)
    
    cogrouped.mapValues(lambda x: (list(x[0]), list(x[1]))).collect()
    ## [('foo', ([1], [4])), ('bar', ([2], [5, 6])), ('baz', ([3], []))]
    
    使用Spark数据帧 您可以使用SQL DSL,也可以使用
    sqlContext.SQL
    执行原始SQL

    df1 = spark.createDataFrame(rdd1, ('k', 'v1'))
    df2 = spark.createDataFrame(rdd2, ('k', 'v2'))
    
    # Register temporary tables to be able to use `sparkSession.sql`
    df1.createOrReplaceTempView('df1')
    df2.createOrReplaceTempView('df2')
    
    内部联接:

    # inner is a default value so it could be omitted
    df1.join(df2, df1.k == df2.k, how='inner') 
    spark.sql('SELECT * FROM df1 JOIN df2 ON df1.k = df2.k')
    
    左外连接:

    rdd1.leftOuterJoin(rdd2)
    
    df1.join(df2, df1.k == df2.k, how='left_outer')
    spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')
    
    交叉连接(Spark.2.0-)中需要显式交叉连接或配置更改:

    由于1.6(Scala中为1.5),因此每种功能都可以与
    广播功能结合使用:

    from pyspark.sql.functions import broadcast
    
    df1.join(broadcast(df2), df1.k == df2.k)
    

    执行广播连接。另请参见

    只需注意:笛卡尔函数实际上在RDD(非PairRDD)df1上可用。join(df2,df1.k==df2.k,joinType='left_outer')如何将多个逻辑引入参数输入?df1.k==df2.k | df1.k2==df2.k2?@paradox
    (df1.k==df2.k)|(df1.k2==df2.k2)
    ,但将其作为一个
    并集或熔化并转换为等联接会更有意义。@zero323:回答得很好。我建议的唯一更改是,从2.0版开始,他们将“joinType”更改为“how”。是否可以在连接条件中添加函数。假设我有一个函数,它检查两个字符串的相似性并返回相似性的百分比。例如:
    df1.join(df2,stringFunction(df1.k,df2.k)>80,how='left_outer')
    from pyspark.sql.functions import broadcast
    
    df1.join(broadcast(df2), df1.k == df2.k)