使用Pyspark分析多个非文本文件

时间:2017-09-27 21:05:20

标签: python multithreading pyspark

我想要使用PySpark处理几个.mat文件(matlab)。但我不确定如何并行完成。这是我希望并行化的基本单线程设置。代码将生成一个列表列表,其中每个内部列表具有任意长度:

filenames = ['1.mat','2.mat',...]
output_lists = [None]*len(filenames) # will be a list of lists

for i,filename in enumerate(filenames):
    output_lists[i] = analyze(filename) # analyze is some function that returns a list

任何单独的output_lists [i]都可以适合内存,但整个output_lists对象不能。我想将output_lists作为rdd。

有什么想法吗?我也愿意使用pyspark和多处理模块的组合。谢谢!

2 个答案:

答案 0 :(得分:0)

  • 将文件放入符合POSIX标准的文件系统,可以从每个工作人员访问(NFS,MapR文件系统,Databricks文件系统,Ceph)
  • 转换路径,以便它们反映文件系统中的路径。
  • parallelize名称:

    rdd = sc.parallelize(filenames)
    
  • mapprocess

    result = rdd.map(analyze)
    
  • 做任何你想做的事情。

答案 1 :(得分:0)

另一个答案看起来很优雅,但我不想安装新的文件系统。我选择与joblib模块并行分析文件,将结果写入.txt文件,并使用Spark打开.txt文件。

from joblib import Parallel, delayed

def analyze(filename):
    # write results to text file with name= filename+'.txt'
    return

filenames = ['1.mat', '2.mat', ...]
Parallel(n_jobs=8)(delayed(analyze)(filename) for filename in filenames)

然后我使用Pyspark将所有.txt文件读取到一个rdd:

data = sc.textFile('path/*.txt')