Я обнаружил нежелательный результат с декартовой функцией 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.
Что вызывает эту проблему? И как это предотвратить?
count
не воспроизводится с текущей версией, и проблема (порядок) является ожидаемым поведением. Spark не дает никаких гарантий относительно порядка значений в таком случае. - person zero323   schedule 29.02.2016RDD
- person Alberto Bonsanto   schedule 01.03.2016