我有一个任务,我收到一个文件列表(每个文件的大小非常小),应该用于处理。 我的AWS S3存储桶中存储了数百万个此类文件,我需要过滤和处理上面列表中存在的那些文件。
任何人都可以告诉我在Spark中做到这一点的最佳做法吗?
EG。 XYZ大学的AWS S3存储桶中存在数百万个文件。每个文件都有一个唯一的ID作为文件名。我得到了要处理的1000个唯一ID的列表。现在我必须只对这些文件进行处理以聚合并生成输出csv文件。
答案 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();
});