Python 多rdd的火花并合

Python 多rdd的火花并合,python,apache-spark,pyspark,rdd,Python,Apache Spark,Pyspark,Rdd,在我的pig代码中,我执行以下操作: all_combined = Union relation1, relation2, relation3, relation4, relation5, relation 6. 我想对spark也这么做。然而,不幸的是,我发现我必须两两进行: first = rdd1.union(rdd2) second = first.union(rdd3) third = second.union(rdd4) # .... and so on 是否有联合运营

在我的pig代码中,我执行以下操作:

all_combined = Union relation1, relation2, 
    relation3, relation4, relation5, relation 6.
我想对spark也这么做。然而,不幸的是,我发现我必须两两进行:

first = rdd1.union(rdd2)
second = first.union(rdd3)
third = second.union(rdd4)
# .... and so on
是否有联合运营商允许我一次操作多个RDD:

e、 g.
union(rdd1、rdd2、rdd3、rdd4、rdd5、rdd6)


这是一个方便的问题。

不幸的是,这是在Spark中联合
表的唯一方法。然而

first = rdd1.union(rdd2)
second = first.union(rdd3)
third = second.union(rdd4)
...
您可以以一种更简洁的方式执行它,如下所示:

result = rdd1.union(rdd2).union(rdd3).union(rdd4)

如果这些是RDD,您可以使用
SparkContext.union
方法:

rdd1 = sc.parallelize([1, 2, 3])
rdd2 = sc.parallelize([4, 5, 6])
rdd3 = sc.parallelize([7, 8, 9])

rdd = sc.union([rdd1, rdd2, rdd3])
rdd.collect()

## [1, 2, 3, 4, 5, 6, 7, 8, 9]
没有与数据帧等价的
DataFrame,但它只是一个简单的单行程序:

from functools import reduce  # For Python 3.x
from pyspark.sql import DataFrame

def unionAll(*dfs):
    return reduce(DataFrame.unionAll, dfs)

df1 = sqlContext.createDataFrame([(1, "foo1"), (2, "bar1")], ("k", "v"))
df2 = sqlContext.createDataFrame([(3, "foo2"), (4, "bar2")], ("k", "v"))
df3 = sqlContext.createDataFrame([(5, "foo3"), (6, "bar3")], ("k", "v"))

unionAll(df1, df2, df3).show()

## +---+----+
## |  k|   v|
## +---+----+
## |  1|foo1|
## |  2|bar1|
## |  3|foo2|
## |  4|bar2|
## |  5|foo3|
## |  6|bar3|
## +---+----+
如果使用RDD上的
SparkContext.union
并重新创建
DataFrame
可能是避免以下情况的更好选择:

def unionAll(*dfs):
首先,*dfs=python3.x,对于2.x,您必须手动解包
返回first.sql\u ctx.createDataFrame(
first.sql_ctx._sc.union([df.rdd表示dfs中的df]),
第一,模式
)

您还可以使用加法在RDD之间进行联合

rdd = sc.parallelize([1, 1, 2, 3])
(rdd + rdd).collect()
## [1, 1, 2, 3, 1, 1, 2, 3]

在这里休息的目的是什么?我想在一行DFs之间执行大约3000个联合。使用第一个选项,在第100次迭代之后,它会以指数级的速度变慢(我正在用TQM测试这一点)。使用第二个选项,它从一开始就非常慢,并保持线性减速。有更好的方法吗?@drkostas可能不是最好的方法,但我通过保存RDD然后加载并继续循环解决了这个问题。这将终止RDD的历史记录,您正在减慢速度,因为它会在每个新循环之前重新运行RDD历史记录中的每个循环。斯帕克不喜欢looping@Gramatik是的,我也用同样的方法解决了。通过使用选项
append
保存拼花地板中的每个数据帧,然后将拼花地板加载到新的数据帧中。spark中有多种方法可以合并表。这一评论是不正确的。见上文zero323的评论