Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件名附加到RDD_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 将文件名附加到RDD

Python 将文件名附加到RDD,python,apache-spark,pyspark,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始终是上次

我有一个包含我的数据文件的文件夹。每个文件的大小约为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)
但这会产生错误:
广播只能在驱动程序中序列化


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

我想你想要这样的东西:

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/*")])