用于在AWS S3中处理的Apache spark过滤文件

时间:2018-03-06 05:52:31

标签: apache-spark amazon-s3 apache-spark-sql

我有一个任务,我收到一个文件列表(每个文件的大小非常小),应该用于处理。 我的AWS S3存储桶中存储了数百万个此类文件,我需要过滤和处理上面列表中存在的那些文件。

任何人都可以告诉我在Spark中做到这一点的最佳做法吗?

EG。 XYZ大学的AWS S3存储桶中存在数百万个文件。每个文件都有一个唯一的ID作为文件名。我得到了要处理的1000个唯一ID的列表。现在我必须只对这些文件进行处理以聚合并生成输出csv文件。

2 个答案:

答案 0 :(得分:0)

提供以逗号分隔的文件路径列表 例如如果这些是json文件

 x$trat=apply(x[-1],1,function(y)glue::collapse(y[!is.na(y)],", ",last = ", and "))
> x$treat[1]
[1] "snap"

> x$treat[2]
[1] "snap, crackle, and yummy"

> x$treat[3]
[1] "crackle, and pop"

答案 1 :(得分:0)

浏览了很长时间后,我理解了以下内容。

    String[] list={"s3a://path1/file1","s3a://path1/file2" ...}
    JavaRDD<String> readRDD=spark.read.json(list);

从S3读取对象,将其视为HDFS文件系统,从而降低性能。 因此,如果S3是源代码,那么以下代码将在很大程度上优化性能,因为我们将使用AWS SDK从S3获取对象,然后创建相同的RDD。

    String[] list={"file1","file2" ...};
    JavaRDD<String> readRDD=sc.parallelize(Arrays.asList(list))
            .map(file->{
                AmazonS3Client s3client= new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
                BufferedReader reader = new BufferedReader(new InputStreamReader(s3client.getObject("Bucket-Name", file).getObjectContent()));
                String line;
                StringBuilder sb=new StringBuilder();
                while((line=reader.readLine())!=null) {
                    sb.append(line);
                }
                return sb.toString();
            });