python - Spark 最快的创建 numpy 数组 RDD 的方法

标签 python numpy apache-spark pyspark rdd

我的 spark 应用程序使用 RDD 的 numpy 数组。
目前,我正在从 AWS S3 读取我的数据,它表示为 一个简单的文本文件,其中每一行都是一个向量,每个元素由空格分隔,例如:

1 2 3
5.1 3.6 2.1
3 0.24 1.333

我正在使用 numpy 的函数 loadtxt() 以从中创建一个 numpy 数组。
但是,这种方法似乎非常慢,而且我的应用程序花费了太多时间(我认为)将我的数据集转换为 numpy 数组。

你能建议我一个更好的方法吗?例如,我应该将我的数据集保存为二进制文件吗? 我应该以其他方式创建 RDD 吗?

关于我如何创建 RDD 的一些代码:

data = sc.textFile("s3_url", initial_num_of_partitions).mapPartitions(readData)

读取数据函数:

 def readPointBatch(iterator):
     return [(np.loadtxt(iterator,dtype=np.float64)]

最佳答案

简单地使用 numpy.fromstring 进行映射会更加地道,速度也稍微快一些,如下所示:

import numpy as np.

path = ...
initial_num_of_partitions = ...

data = (sc.textFile(path, initial_num_of_partitions)
   .map(lambda s: np.fromstring(s, dtype=np.float64, sep=" ")))

但忽略了您的方法没有特别错误的地方。据我所知,使用基本配置,简单地读取数据大约慢两倍,比创建虚拟 numpy 数组慢一点。

所以看起来问题出在其他地方。这可能是集群配置错误、从 S3 获取数据的成本,甚至是不切实际的期望。

关于python - Spark 最快的创建 numpy 数组 RDD 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33804380/

相关文章:

python - Wayland 上的 wxpython 无法与屏幕坐标交互(移动窗口、GetScreenPosition 等)

python - 从列表创建迭代器对象后删除列表

python - Numpy 矩阵除法返回全零

hadoop - 使用 derby 进行 Hive 元存储配置

python - ModuleNotFoundError : No module named 'tf_slim'

python - 查找 numpy 元组数组中给定位置的唯一值

python - SciPy - 计算对称矩阵中特定特征值的特征向量

java - Spark Cassandra 连接器 3.0.0 - 如何启用 DirectJoin - Java

scala - java.lang.AssertionError : assertion failed: No plan for HiveTableRelation

python - HINT : There is a column named "title" in table "wenzhang", 但不能从这部分查询中引用