Spark:使用scala从s3读取csv文件

时间:2015-09-09 04:02:51

标签: scala amazon-web-services amazon-s3 apache-spark

我正在编写一个spark作业,尝试使用scala读取文本文件,以下在我的本地计算机上工作正常。

  val myFile = "myLocalPath/myFile.csv"
  for (line <- Source.fromFile(myFile).getLines()) {
    val data = line.split(",")
    myHashMap.put(data(0), data(1).toDouble)
  }

然后我尝试在AWS上运行它,我做了以下操作,但它似乎没有正确读取整个文件。什么应该是在s3上阅读此类文本文件的正确方法?非常感谢!

val credentials = new BasicAWSCredentials("myKey", "mySecretKey");
val s3Client = new AmazonS3Client(credentials);
val s3Object = s3Client.getObject(new GetObjectRequest("myBucket", "myFile.csv"));

val reader = new BufferedReader(new InputStreamReader(s3Object.getObjectContent()));

var line = ""
while ((line = reader.readLine()) != null) {
      val data = line.split(",")
      myHashMap.put(data(0), data(1).toDouble)
      println(line);
}

2 个答案:

答案 0 :(得分:0)

使用sc.textFile("s3://myBucket/myFile.csv")读入csv文件。那会给你一个RDD [String]。把它放到地图中

val myHashMap = data.collect
                    .map(line => {
                      val substrings = line.split(" ")
                      (substrings(0), substrings(1).toDouble)})
                    .toMap

您可以使用sc.broadcast广播您的地图,以便在您的所有工作节点上随时可用。

(请注意,如果您愿意,您当然也可以使用Databricks&#34; spark-csv&#34;包来读取csv文件。)

答案 1 :(得分:0)

即使不使用SparkContext textfile导入amazons3库也可以实现。使用以下代码

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.conf.Configuration
val s3Login = "s3://AccessKey:Securitykey@Externalbucket"
val filePath = s3Login + "/Myfolder/myscv.csv"
for (line <- sc.textFile(filePath).collect())
{
    var data = line.split(",")
    var value1 = data(0)
    var value2 = data(1).toDouble
}

在上面的代码中,sc.textFile将从文件中读取数据并将其存储在line RDD中。然后,它将,中的每一行拆分为循环内的另一个RDD data。然后,您可以使用索引从该RDD中访问值。