私の豚のコードで私はこれを行います:
all_combined = Union relation1, relation2,
relation3, relation4, relation5, relation 6.
スパークでも同じことをしたいです。しかし、残念ながら、私はペアでそれを続けなければならないことがわかります:
first = rdd1.union(rdd2)
second = first.union(rdd3)
third = second.union(rdd4)
# .... and so on
一度に複数のrddを操作できる共用体演算子はありますか?
例えばunion(rdd1, rdd2,rdd3, rdd4, rdd5, rdd6)
それは利便性の問題です。
これらが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
はありませんが、単純な1行の問題です。
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|
## +---+----+
DataFrames
の数が大きい場合、RDDでSparkContext.union
を使用し、DataFrame
を再作成することは避けるべきより良い選択かもしれません 実行計画の準備に関連する問題 :
def unionAll(*dfs):
first, *_ = dfs # Python 3.x, for 2.x you'll have to unpack manually
return first.sql_ctx.createDataFrame(
first.sql_ctx._sc.union([df.rdd for df in dfs]),
first.schema
)