2015-06-15 3 views
1

У меня есть массив размеров 500 x 26. Используя операцию фильтра в pyspark, я бы хотел выделить столбцы, которые перечислены в другом массиве в строке i. Пример: если
a[i]= [1 2 3]Pyspark: использование фильтра для выбора функции

Затем выберите столбцы 1, 2 и 3 и все строки. Можно ли это сделать с помощью команды фильтра? Если да, может ли кто-нибудь показать пример или синтаксис?

+0

Если я уверен, что у вас есть rdd массивов (500x26), но как i s i подключен к элементам вашего rdd. – abalcerek

+0

Это не связано .. просто элемент массива, который все – optimist

ответ

2

Похоже, вам нужно фильтровать столбцы, но не записи. Для этого вам нужно использовать функцию карты Spark - преобразовать каждую строку вашего массива, представленную как RDD. См в моем примере:

# generate 13 x 10 array and creates rdd with 13 records, each record contains a list with 10 elements 
rdd = sc.parallelize([range(10) for i in range(13)]) 

def make_selector(cols): 
    """use closure to configure select_col function 
    :param cols: list - contains columns' indexes to select from every record 
    """ 
    def select_cols(record): 
      return [record[c] for c in cols] 
    return select_cols 

s = make_selector([1,2]) 
s([0,1,2]) 
>>> [1, 2] 

rdd.map(make_selector([0, 3, 9])).take(5) 

приводит

[[0, 3, 9], [0, 3, 9], [0, 3, 9], [0, 3, 9], [0, 3, 9]] 
+0

Спасибо @ vvladymyrov .. Это именно то, что я пытался сделать ... – optimist

0

Это, по существу, тот же ответ, как @ vvladymyrov, но без закрытия:

rdd = sc.parallelize([range(10) for i in range(13)]) 
columns = [0,3,9] 
rdd.map(lambda record: [record[c] for c in columns]).take(5) 

приводит

[[0, 3, 9], [0, 3, 9], [0, 3, 9], [0, 3, 9], [0, 3, 9]] 
Смежные вопросы