我在Amazon S3上有一个包含JSON对象的大文本文件。我计划在Amazon EMR上使用Spark处理这些数据。
以下是我的问题:
答案 0 :(得分:10)
这应该涵盖#1,只要您使用pyspark:
#Configure spark with your S3 access keys
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "MY-ACCESS-KEY")
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "MY-SECRET-ACCESS-KEY")
#Retrieve the data
my_data = sc.textFile("s3n://my-bucket-name/my-key")
my_data.count() #Count all rows
my_data.take(20) #Take the first 20 rows
#Parse it
import json
my_data.map(lambda x: json.loads(x)).take(20) #Take the first 20 rows of json-parsed content
请注意,s3地址为s3n://
,而非s3://
。这是hadoop的遗产。
此外,my-key
可以指向整个S3目录*。如果您正在使用火花群集,则导入多个中等大小的文件通常比单个大文件快。
对于#2和#3,我建议查找spark的镶木地板支撑。您还可以将文本保存回s3:
my_data.map(lambda x: json.dumps(x)).saveAsTextFile('s3://my-bucket-name/my-new-key')
不知道数据集的大小和管道的计算复杂性,我无法说出将中间数据存储到S3的哪种方式将最有效地利用您的资源。
* S3确实没有目录,但你知道我的意思。