我在AWS S3存储桶中有一堆包含时间和空间相关的dats的csv文件。这些文件以5分钟的粒度为时间戳前缀。 当尝试使用Apache Spark从AWS EMR访问它们并尝试过滤时间和空间时,即使是强大的集群(5 x r3.8xlarge)也会崩溃。 I的数据试图用广播连接进行过滤。 位置是具有用户ID,时间戳和移动单元信息的类,我尝试与单元位置信息(segmentDF)连接以仅过滤所需的那些记录。
我需要进一步处理这些记录,这里只是尝试将它们保存为镶木地板。我认为必须有一种更有效的方法,从将数据存储在S3存储桶中开始。任何想法都表示赞赏。
http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219提出了一种替代且更快的方式从spark访问S3存储桶,我无法实现(参见下面的代码和错误代表)。
"com.google.android.gms.ads.AdActivity"
后者以错误 \\ Scala code for the filtering
val locationDF = sc.textFile(s"bucket/location_files/201703*")
.map(line => {
val l = new Location(line)
(l.id, l.time, l.cell)
})
.toDF("id", "time", "cell")
val df = locationDF.join(broadcast(segmentDF), Seq("cell"), "inner").select($"id", $"time", $"lat", $"lng", $"cellName").repartition(32)
df.write.save("somewhere/201703.parquet")
\\ Alternative way of accessing S3 keys
import com.amazonaws.services.s3._, model._
import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain
val credentials = new DefaultAWSCredentialsProviderChain().getCredentials
val request = new ListObjectsRequest()
request.setBucketName("s3-eu-west-1.amazonaws.com/bucket")
request.setPrefix("location_files")
request.setMaxKeys(32000)
def s3 = new AmazonS3Client(new BasicAWSCredentials(credentials.getAWSAccessKeyId, credentials.getAWSSecretKey))
val objs = s3.listObjects(request)
sc.parallelize(objs.getObjectSummaries.map(_.getKey).toList)
.flatMap { key => Source.fromInputStream(s3.getObject(bucket, key).getObjectContent: InputStream).getLines }