来自平面文本文件的分布式dask矩阵

时间:2016-06-03 00:03:02

标签: python apache-spark dataframe pyspark dask

我尝试将矩阵的平面文本文件(制表符分隔)表示读取到dask数组中,使用distributed在整个群集中分布数组的块。

(旁白:这与PySpark' s sc.textFile方法不同)

但是,我不清楚如何使用可用工具将文本文件解析为矩阵结构。在PySpark中,我可以使用简单的map来实现这一点,其中UDF将空格上的每一行拆分并将标记转换为浮点数列表,最后将列表转换为[索引的] numpy数组。

我开始使用dask.bag.read_text方法,该方法的参数collection我可以设置为False,因此它可以将一堆Delayed期货交给我。 如何将这些解析为最终矩阵的行?

from dask.bag import read_text
matrix = read_text(filename.txt, collection = False)

这只会返回一个未来。如何为文本文件中的每一行生成未来?

1 个答案:

答案 0 :(得分:0)

这里有几个步骤:

使用read_text

将单个文件拆分为多个文件

默认情况下,read_text将每个文件视为单个流分区。如果您希望将数据分成几部分,请使用blocksize=关键字参数

futures = db.read_text('filename.txt', collection=False, blocksize=10000000)

将文本列表的期货转换为numpy数组的未来

使用你控制的未来,大概你会创建一个函数来将你的列表转换为numpy数组

def list_to_array(L):
    my_array = ...
    return my_array

将期货转换为小型dask.arrays

我们将每个未来转换为dask.array

from distributed.collections import futures_to_dask_arrays

arrays = futures_to_dask_arrays(futures)

将许多数组连接成单个数组

import dask.array as da

array = da.concatenate(arrays, axis=0)