RDD转换图,Python

时间:2016-03-11 10:29:38

标签: python list apache-spark pyspark rdd

是否可以将Spark的map方法中的所有元素转换为float(double),除了第一个没有使用for-loop进行迭代的情况?在伪代码中有类似的东西:

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

1 个答案:

答案 0 :(得分: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替换为第一个非空分区的索引。