将文件名附加到RDD

时间:2015-07-30 21:54:57

标签: python apache-spark pyspark

我有一个包含我的数据文件的文件夹。每个文件的大小约为1 GB。

我需要的是RDD中的文件名。

以下操作无效:

import glob
rdds = []
for filename in glob.iglob('/data/*'):
    rdd = sc.textFile(filename).map(lambda row: (filename, row))
    rdds.append(rdd)

allData = sc.union(rdds)

使用此项,filename始终是最后一个读取文件的文件名

我也尝试过:

import glob
rdds = []
for filename in glob.iglob('/data/*'):
    def f(name=filename):
        return name
    rdd = sc.textFile(filename).map(lambda row: (f(), row))
    rdds.append(rdd)

allData = sc.union(rdds)

但是会产生错误:Broadcast can only be serialized in driver

sc.wholeTextFile()不是一个选项,因为单个文件很大。

1 个答案:

答案 0 :(得分:4)

我猜你想要这样的东西:

import functools

def proc(f):
    return sc.textFile(f).map(lambda x: (f, x))

rdd = functools.reduce(
    lambda rdd1, rdd2: rdd1.union(rdd2),
    (proc(f) for f in glob.glob("/data/*")))

sc.union

sc.union([proc(f) for f in glob.glob("/data/*")])