Java 如何使用ApacheSpark从AmazonS3读取文件而不将其写入本地文件?

Java 如何使用ApacheSpark从AmazonS3读取文件而不将其写入本地文件?,java,amazon-web-services,apache-spark,amazon-s3,Java,Amazon Web Services,Apache Spark,Amazon S3,我将文件存储在AmazonS3云中。我想部分解析文件。我尝试用这种方法读取文件。但这花了太多时间。因为它首先将这个文件写入本地文件。Spark正在使用本地保存的文件对其进行分析。 有没有办法直接使用spark从AmazonS3读取文件 我试过这种方法 package com.elegant.amazon; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import ja

我将文件存储在AmazonS3云中。我想部分解析文件。我尝试用这种方法读取文件。但这花了太多时间。因为它首先将这个文件写入本地文件。Spark正在使用本地保存的文件对其进行分析。 有没有办法直接使用spark从AmazonS3读取文件

我试过这种方法

package com.elegant.amazon;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;

public class AmazonS3Spark {

    public static void main(String[] args) throws IOException {
        int numOfLinesRead = 0;
        SparkSession spark = SparkSession.builder().appName("SparkCassandraApp")
                .config("spark.cassandra.connection.host", "localhost")
                .config("spark.cassandra.connection.port", "9042").master("local[*]").getOrCreate();
        String outPutFile = "/home/vipin/mylocalfile.csv";
        FileWriter writer = new FileWriter(outPutFile);
        S3Object s3object = AmazonS3Util.s3Client
                .getObject(new GetObjectRequest("flightdata-em", "2015/On_Time_On_Time_Performance_2015_1.csv"));

        InputStreamReader decoder = new InputStreamReader(s3object.getObjectContent());
        BufferedReader buffered = new BufferedReader(decoder);
        buffered.mark(numOfLinesRead);
        int numOfLinesToRead = 1000;
        String thisLine = null;
        Long startTime = System.currentTimeMillis();
        while ((thisLine = buffered.readLine()) != null && numOfLinesRead < numOfLinesToRead) {
            writer.write(thisLine + '\n');
            numOfLinesRead++;
        }



        Dataset<Row> people = spark.read().csv("/home/vipin/mylocalfile.csv");

        /*Dataset<Row> df = spark.read().option("header", "true").option("treatEmptyValuesAsNulls", "true")
                .option("nullValue", "0").option("delimiter", ",")
                .csv("s3n://AKIAI6OYME7W2QAIIOAA:Cn1XhD72rEIRg7etAjhXFBQLRiverQgsnrtt+CRf@flightdata-em//2015/On_Time_On_Time_Performance_2015_1.csv");*/
        people.printSchema();
        people.show(10000, false);
        System.out.println("Total Time Taken " + (System.currentTimeMillis() - startTime));
    }

}
package.com.elevate.amazon;
导入java.io.BufferedReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入org.apache.spark.sql.Dataset;
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.SparkSession;
导入com.amazonaws.services.s3.model.GetObjectRequest;
导入com.amazonaws.services.s3.model.s3对象;
亚马逊河公园{
公共静态void main(字符串[]args)引发IOException{
int numOfLinesRead=0;
SparkSession spark=SparkSession.builder().appName(“SparkCassandraApp”)
.config(“spark.cassandra.connection.host”、“localhost”)
.config(“spark.cassandra.connection.port”,“9042”).master(“local[*]”).getOrCreate();
字符串outPutFile=“/home/vipin/mylocalfile.csv”;
FileWriter writer=新的FileWriter(outPutFile);
S3Object S3Object=AmazonS3Util.s3Client
.getObject(新的GetObjectRequest(“flightdata em”、“2015/On_Time_On_Time_Performance_2015_1.csv”);
InputStreamReader解码器=新的InputStreamReader(s3object.getObjectContent());
BufferedReader buffered=新的BufferedReader(解码器);
缓冲。标记(numflinesread);
int numOfLinesToRead=1000;
字符串thisLine=null;
Long startTime=System.currentTimeMillis();
while((thisLine=buffered.readLine())!=null&&numOfLinesRead
通过这种方式,它将csv文件写入本地文件,然后spark使用本地文件对其进行解析。因此,性能正在下降。
有没有解决方案可以在不将其本地写入的情况下解析它?

为什么不能使用s3位置而不是本地文件调用
spark.read.csv
?例如
spark.read.csv(“s3n://flightdata em/2015/On\u Time\u On\u Time\u Performance\u 2015\u 1.csv”)
。要使其正常工作,您需要将AWS密钥对添加到Spark配置中。@Dmitry我还使用了s3n://ACCESSKEY:SECRETKEY@flightdata-em//2015/按时‌​Performance_2015_1.csv但在线程“main”java.lang.IllegalArgumentException中出现异常:URI s3://ACCESSKEY中的主机名无效:SECRETKEY@flightdata-em/2015/On_Time_On_Time_Per‌​当您创建
SparkSession
作为两个附加配置参数时,应提供Performance_2015_1.csvAWS密钥对,例如:
SparkSession.builder().appName(“SparkCassandraApp”).config(“fs.s3n.awsAccessKeyId”、“yourAssesKeyId”).config(“fs.s3n.awsseccessKey”、“yourSecretAccessKey”)
@Dmitry感谢您的帮助。