我需要处理分散在各个目录中的多个文件。我想将所有这些加载到单个RDD中,然后在其上执行map / reduce。我看到SparkContext能够使用通配符从单个目录加载多个文件。我不确定如何从多个文件夹加载文件。
以下代码段失败:
for fileEntry in files: fileName = basePath + "/" + fileEntry lines = sc.textFile(fileName) if retval == None: retval = lines else: retval = sc.union(retval, lines)
这在第三个循环中失败,并显示以下错误消息:
retval = sc.union(retval, lines) TypeError: union() takes exactly 2 arguments (3 given)
鉴于我仅提供了两个参数,所以这很奇怪。任何指针表示赞赏。
措辞如何呢?
sc.union([sc.textFile(basepath + "/" + f) for f in files])
在Scala中,SparkContext.union()有两种变体,一种采用vararg参数,另一种采用列表。Python中仅存在第二个(因为Python不具有多态性)。
SparkContext.union()
更新
您可以使用一个textFile调用来读取多个文件。
textFile
sc.textFile(','.join(files))