我正在编写一个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);
}
答案 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中访问值。