Декартова функция Spark дает нежелательный результат

Я обнаружил нежелательный результат с декартовой функцией Spark. Это не воспроизводится с небольшим набором данных; он сохраняется только с большим набором данных.

Например:

Небольшой набор данных

a = sc.parallelize([1, 2, 3, 4, 5])
b = sc.parallelize([(100, 150), (200, 250), (300, 350), (400, 450), (500, 550)])
c = a.cartesian(b)
print c.collect()
print c.count()

напечатать c.collect ()

[(1, (100, 150)), (1, (200, 250)), (2, (100, 150)), (2, (200, 250)), (1, (300, 350)), (1, (400, 450)), (2, (300, 350)), (2, (400, 450)), (1, (500, 550)), (2, (500, 550)), (3, (100, 150)), (3, (200, 250)), (4, (100, 150)), (4, (200, 250)), (5, (100, 150)), (5, (200, 250)), (3, (300, 350)), (3, (400, 450)), (4, (300, 350)), (4, (400, 450)), (3, (500, 550)), (4, (500, 550)), (5, (300, 350)), (5, (400, 450)), (5, (500, 550))]

напечатать c.count ()

25

Поскольку a имеет 5 элементов, а b имеет 5 элементов, декартово произведение двух составляет 25 элементов. Однако для большого набора данных декартово значение меньше ожидаемого.

Большой набор данных

x = sc.parallelize([1, 2, 3, 4, 5])
print x.collect()
"""
y is a RDD in the same format as b.
y.count() == 19475211
""" 
print y.take(5)

z = x.cartesian(y)
print z.take(5)
print z.count()

напечатать x.collect ()

[(1, 2, 3, 4, 5)]

печать y.take (5)

[(5120, 2560), (5120, 3840), (5120, 520), (5120, 3500), (5120, 2060)]

печать z.take (5)

[(1, (5120, 2560)), (1, (5120, 3840)), (1, (5120, 520)), (5120, (3500, 1)), (5120, (2060, 1))]

напечатать z.count ()

7451200

Если вы заметили с большим набором данных, когда вы берете декартову x и y, 4-й элемент z равен (5120, (3500, 1)) вместо (1, (5120, 3500)). Пятый элемент z равен (5120, (2060, 1)) вместо (1, (5120, 2060)).

Кроме того, размер z равен 7451200 вместо 19475211 * 5 = 97376055.

Что вызывает эту проблему? И как это предотвратить?


person user5999311    schedule 29.02.2016    source источник
comment
Каждая пара кортежей в y уникальна, что означает, что одна и та же пара кортежей не будет повторяться.   -  person user5999311    schedule 29.02.2016
comment
Насколько я могу судить, count не воспроизводится с текущей версией, и проблема (порядок) является ожидаемым поведением. Spark не дает никаких гарантий относительно порядка значений в таком случае.   -  person zero323    schedule 29.02.2016
comment
Не могли бы вы предоставить более подробную информацию (версия Spark, версия Python, режим)?   -  person zero323    schedule 29.02.2016
comment
Однако вы можете отсортировать RDD   -  person Alberto Bonsanto    schedule 01.03.2016
comment
сортировка RDD тоже не решила проблему   -  person user5999311    schedule 01.03.2016
comment
версия Spark 1.5.2, версия Python 2.7.10   -  person user5999311    schedule 01.03.2016


Ответы (1)


Хотя я не понял, почему это происходит, я решил проблему. Сначала я транслирую список x, а затем выполняю операцию плоской карты для y. Результат z - это то, что я ожидал.

x = sc.broadcast([1, 2, 3, 4, 5])
z = y.flatMap(lambda (y_1, y_2): [(x_elt, (y_1, y_2)) for x_elt in x.value])
person user5999311    schedule 29.02.2016