How to access this kind of data in Spark
数据以以下形式存储:
1 2 3 4 5 6 7
| data/file1_features.mat
data/file1_labels.txt
data/file2_features.mat
data/file2_labels.txt
...
data/file100_features.mat
data/file100_labels.txt |
每个data/file*_features.mat存储一些样本的特征,并且每一行都是一个样本。每个data/file*_labels.txt存储这些样本的标签,并且每一行都是一个数字(例如1,2,3,...)。在全部100个文件中,总共约有80个百万样本。
在Spark中,如何访问此数据集?
我已经检查了spark-2.0.0-preview/examples/src/main/python/mllib/random_forest_classification_example.py。它包含以下几行:
1 2
| data = MLUtils.loadLibSVMFile(sc, 'data/mllib/sample_libsvm_data.txt')
(trainingData, testData) = data.randomSplit([0.7, 0.3]) |
我在./bin/pyspark中运行此示例,它显示data对象是PythonRDD。
1
| PythonRDD[32] at RDD at PythonRDD.scala:48 |
data/mllib/sample_libsvm_data.txt只是一个文件。就我而言,有很多文件。 Spark中是否有任何RDD可以方便地处理这种情况?是否需要将所有100文件合并为一个大文件并作为示例进行处理?我想使用Spark引擎缩放数据集(均值标准归一化或最小-最大归一化)。
- 我看到有两种类型的文件,一种扩展名为.mat,另一种扩展名为.txt ...您想将所有文件加载到单个rdd中进行处理吗?还是只想加载txt / mat文件?
-
@Shashi,是的,我想同时加载两种类型的数据。 *.mat文件是功能部件,*.txt文件是标签。如果我理解正确,我认为数据已被分片。因此,我想知道我们是否应该编写一些简单的界面来控制*.mat文件(例如使用h5py)将其加载到numpy数组中,然后将其馈入Spark中的RDD中。然后在pyspark中,我们可以使用RDD。
如果要加载特定的文件类型进行处理,则可以使用正则表达式将文件加载到RDD中。
dir = " data / *。txt "
sc.textFile(dir)
Spark将所有以txt扩展名结尾的文件。
-
谢谢你!我也想加载*.mat文件。也许我应该将特征存储为*.txt格式。您的解决方案是一个好的开始。
简单点
1 2
| dir ="<path_to_data>/data"
sc.textFile(dir) |
Spark自动拾取该目录内的所有文件
- 谢谢你!我也想加载*.mat文件。也许我应该将特征存储为*.txt格式。您的解决方案是一个好的开始。
-
Spark是否已经支持读取MATLAB文件?我认为我们应该首先将MATLAB矩阵转换为*.txt格式。
-
不-我没有"理解"您的意思。文件的语义由您提供。我的意思是,所有文件(无论扩展名如何)都会被吸收。您将需要确保文件格式和spark worker应用程序/代码的预期用途兼容。
-
我想我没有完全理解您的想法。我对Spark不熟悉。我认为我应该掌握有关RDD的基本知识。搜索后,我发现该帖子[blog.madhukaraphatak.com/matfile-to-rdd/]和此帖子[stackoverflow.com/questions/24029873/…可能与此问题有关。如果我理解正确,我们应该首先将批处理数据读取到内存中,然后将它们合并到一个大的RDD中。但这似乎不适用于RDD。由于我在Spark上的信息有限,我认为RDD可能只是映射中的某些文件密钥。
-
您无需担心合并:Spark会照顾到它。但是,您应该在.mat文件上进行预处理,以使它们在RDD操作之前进入适当的结构。假设它们很少。如果很多,您可以考虑单独执行一个仅对.mat文件进行预处理的Spark步骤:但是如果您需要将.mat文件与.txt放在单独的目录中
-
谢谢!我会尝试的。现在,我决定首先将特征(即*.mat文件)转换为*.txt格式。由于这些功能包含多个不同的功能,因此我决定将它们保存为以下格式data/features/feature1/file1.txt,data/features/feature2/file1.txt,...,data/features/feature1/file100.txt。对于标签,我将它们保存到data/labels/file1.txt,data/labels/file2.txt,...,data/labels/file100.txt中。然后,我将尝试sc.textFile('data/features/')将它们加载到RDD中。
-
但是,由于*.txt文件格式,要保存这些功能将花费大量磁盘空间。
-
@mining Spark不是matlab-因此我们需要做出让步。在任何情况下,磁盘空间都可能成为这里的受限资源:cpu和/或ram更有可能,而网络是第三种可能的责任。
-
你是对的。非常感谢您的意见和建议!