2016-04-06 6 views
0

Так что у меня есть эти два РДА, которые выглядят следующим образом:Pyspark: Получить индексы РДА элементов из другого РДА

rdd1: [([1, 2], 0), ([2, 4], 1)] 
rdd2: [([2, 4], 0), ([1, 2], 1)] 

Что мне нужно, это список, который указует индексы rdd1 элементов в rdd2. так что это будет что-то вроде этого:

[1,0] 

Я знаю, что я могу найти один конкретный индекс элемента, используя фильтр и лямбда-функции, но найти все это другая история. Наивный подход в моей голове использует цикл for, который, я уверен, не лучший способ справиться с этой проблемой. Любая помощь приветствуется.

Благодаря

ответ

1

Сначала вы должны сделать ключи hashable таким образом, они могут быть сопоставлены распределенным образом. Позволяет создать маленький помощник

def tupelize_keys(kv): 
    k, v = kv 
    return tuple(k), v 

rdd1H = sc.parallelize([ 
    ([1, 2], 0), ([2, 4], 1), ([9, 9], 3) 
]).map(tupelize_keys) 

rdd2H = sc.parallelize([ 
    ([2, 4], 0), ([1, 2], 1), ([1, 2], 3) 
]).map(tupelize_keys) 

Все, что осталось простое внешнее соединение:

rdd1H.leftOuterJoin(rdd2H).values().collect() 
## [(0, 1), (0, 3), (1, 0), (3, None)] 

Обратите внимание, что это MultiMap и порядок не сохраняется.

Смежные вопросы