如何在scala中创建多维数组并保存在文本文件中

时间:2018-03-16 20:11:41

标签: arrays scala apache-spark multidimensional-array text-files

我尝试打开文本文件,处理每一行并将结果存储在多维数组中。

我的输入文件包含:

1 1 3 2  
2 2.2 3 1.8  
3 3 1.2 2.5   

我想创建一个像这样的3x4数组:

(1, 1, 3, 2)  
(2, 2.2, 3 1.8)  
etc

我的代码是:

for (line <- Source.fromFile(inputFile).getLines) {
 var counters = line.split("\\s+")
 sc.parallelize(counters).saveAsTextFile(outputFile)
}

我正在尝试将结果保存在文本中,但首先我在运行过程中遇到了异常:

apache.hadoop.mapred.FileAlreadyExistsException:
  Output directory file:/home/user/Desktop/output.txt already exists

我猜这是关于并行化的,但这是我找到保存数组的唯一方法。

此外,存储的内容不是我想要的。该文件有两个包含以下内容的分区文件:

第1部分:

1  
1  

第2部分:

3  
2  

如何从一个维度数组创建多维数组,如何将其保存在文本文件中?

1 个答案:

答案 0 :(得分:1)

您为每行创建单独的RDD(并将其保存到文件),而不是为整个文件创建一个RDD。此外,由于您使用Spark(请参阅免责声明)来编写该文件 - 您还可以使用它来读取它。以下是解决问题的方法:

sc.textFile(inputFile)
  .map(_.split("\\s+").mkString(",")) // if you want result to be comma-delimited
  .repartition(1) // if you want to make sure output has one partition (file)
  .saveAsTextFile(outputFile)

虽然有一些免责声明:

  • 如果文件确实相对较小(因此可以使用fromFile加载) - 为什么需要Spark? Spark通常应该用于对于单个文件/单个进程的内存来说太大而无法处理的数据
  • 您必须确保outputFile在运行之前不存在 - 否则您将看到相同的异常(Spark小心不要覆盖您的数据,因此它如果输出文件(实际上是文件夹)已经存在,则会失败)