2016-03-11 3 views
1

Можно ли преобразовать все элементы в методе карты Spark в float (double), исключая первый, без выполнения итерации с циклом for? Что-то вроде этого в псевдокоде:Карта преобразования RDD, Python

input = sc.textFile('file.csv').map(lambda line: line.split(',')) #create a rdd<list> 
test = input.map(lambda line: line[0] else float(line)) #convert all elements of the list to float excepted the first one 

ответ

2

Возможно, хотя это, возможно, не очень хорошая практика. RDD - однородный набор объектов. Если вы ожидаете какой-то заголовок, лучше отбросить его, чем перетащить его полностью. Тем не менее, вы можете попробовать что-то вроде этого:

from itertools import islice 

# Dummy data 
with open("/tmp/foo", "w") as fw: 
    fw.writelines(["foo", "1.0", "2.0", "3.0"]) 

def process_part(i, iter): 
    if i == 0: 
     # We could use enumerate as well 
     for x in islice(iter, 1): 
      yield x 
    for x in iter: 
     yield float(x) 

(sc.textFile("foo.txt") 
    .mapPartitionsWithIndex(process_part) 
    .collect()) 
## ['"foo"', 1.0, 2.0, 3.0, 4.0] 

Если вы предполагаете пустые разделы считать элементы первой:

rdd.mapPartitionsWithIndex(lambda i, iter: [(i, sum(1 for _ in iter))]).collect() 

и заменить 0 с индексом первого непустого раздела.

+0

Спасибо за ваш ответ, я пытаюсь определить какой-то ключ для числовых значений. RDD необходимо модифицировать только один раз при загрузке файла csv или txt. – Guforu