Подтвердить что ты не робот

Объединение искр нескольких RDD

В моем коде свиньи я делаю это:

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

Существует ли оператор объединения, который позволит мне работать с несколькими rdds за раз:

например. union(rdd1, rdd2,rdd3, rdd4, rdd5, rdd6)

Это вопрос удобства.

4b9b3361

Ответ 1

Если это 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|
## +---+----+

Если число DataFrames велико с использованием SparkContext.union на RDD, а воссоздание DataFrame может быть лучшим выбором, чтобы избежать вопросов, связанных со стоимостью подготовка плана выполнения:

def unionAll(*dfs):
    first, *rest = 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
    )

Ответ 2

К сожалению, это единственный способ для таблиц UNION в Spark. Однако вместо

first = rdd1.union(rdd2)
second = first.union(rdd3)
third = second.union(rdd4)
...

вы можете сделать это немного чище, как это:

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