在创建Spark RDD之前,从S3读取数据到内存

时间:2016-05-26 20:18:50

标签: amazon-s3 apache-spark

我有一个Python应用程序,它使用两组彼此相关的数据。一组数据是存储在一堆文件中的一堆矩阵。每个文件中都有一个矩阵。此外,每个文件都与之关联,另一个文件包含矩阵行的标签。这两个数据集已存储在S3中。我想将嵌入到不同文件中的矩阵连接起来,然后使用Spark.mllib在矩阵的行上执行KMeans聚类。

作为一个小例子,这是连接矩阵: 矩阵= [[2,7,6],[3,6,1],[8,0,1],[6,2,3],[1,9,0]]

我们希望将此矩阵的行聚类为两组。因此这是Spark输出: OUT = [1,0,0,1,0]

但问题是: 我有一个庞大的图像数据矩阵。矩阵中的每一行都是指图像。我想跟踪矩阵中每一行所指的图像。所以我需要做的事情(至少我想我需要做的)是从S3顺序读取每个矩阵文件和相关的标记文件到内存,这样我就不会忘记矩阵行的标记。然后根据内存中的矩阵文件创建RDD。我对如何做到这一点表示感谢。

顺便说一下,我正在使用Pyspark,boto和boto3。

1 个答案:

答案 0 :(得分:0)

在寻找解决方法并找不到直接解决方案后,我尝试了下面提到的解决方案:

1:将行标签和矩阵放在Pandas DataFrame中,将矩阵的每一行与相应的标签相关联。

2:使用Pandas to_csv方法将DataFrame转储为使用Pipe(" |")作为分隔符的文本文件。

3:将文本文件推送到S3。

4:然后使用rdd = sc.textFile(s3n:// user @ pass:bucketname / * .csv)根据S3存储桶中的所有csv文件创建RDD。

  1. 使用过的data = rdd.map(lambda line:array([float(x)for x in line.split(' |')[1:]]))来创建RDD实际数据。

  2. 使用labels = rdd.map(lambda line:line.split(' |')[0])来提取标签。

  3. 然后对实际数据执行了KMeans。

  4. 希望这有帮助。