Фильтр RDD для возврата - PullRequest
0 голосов
/ 13 января 2020

Моя функция (test_rdd.cartesian (test_rdd)) возвращает СДР пар значений, например:

[((1, 0), (1, 0)),
 ((1, 0), (2, 0)),
 ((1, 0), (3, 0)),
 ((2, 0), (1, 0)),
 ((2, 0), (2, 0)),
 ((2, 0), (3, 0)),
 ((3, 0), (1, 0)),
 ((3, 0), (2, 0)),
 ((3, 0), (3, 0))]

Мне нужно избавиться от тех записей, где оба элемента равны (например: ..., ((1, 0), (1, 0)), ...).

Поскольку я только начал работать с rdd и spark, я мог упустить что-то действительно базовое c.

Можете ли вы дать мне идею?

1 Ответ

0 голосов
/ 13 января 2020

Вы можете попробовать следующий код для Scala:

val array = Array(((1, 0), (1, 0)),
 ((1, 0), (2, 0)),
 ((1, 0), (3, 0)),
 ((2, 0), (1, 0)),
 ((2, 0), (2, 0)),
 ((2, 0), (3, 0)),
 ((3, 0), (1, 0)),
 ((3, 0), (2, 0)),
 ((3, 0), (3, 0)))

val rdd = sc.parallelize(array) // creating RDD
val filteredRDD = rdd.filter(row => row._1  != row._2) //accessing element in tuple 
filteredRDD.collect() // calling action

Результат:

Array[((Int, Int), (Int, Int))] = Array(((1,0),(2,0)), ((1,0),(3,0)), ((2,0),(1,0)), ((2,0),(3,0)), ((3,0),(1,0)), ((3,0),(2,0)))

Для Pyspark можно использовать следующий код:

array = [((1, 0), (1, 0)), ((1, 0), (2, 0)), ((1, 0), (3, 0)), ((2, 0), (1, 0)), ((2, 0), (2, 0)), ((2, 0), (3, 0)), ((3, 0), (1, 0)), ((3, 0), (2, 0)), ((3, 0), (3, 0))]

rdd = sc.parallelize(array) # creating RDD
filteredRDD = rdd.filter(lambda row : row[0]  != row[1]) #accessing element in tuple 
filteredRDD.collect() # calling action

Результат:

[((1, 0), (2, 0)),
 ((1, 0), (3, 0)),
 ((2, 0), (1, 0)),
 ((2, 0), (3, 0)),
 ((3, 0), (1, 0)),
 ((3, 0), (2, 0))]
...