我在 Amazon S3 上有一个包含 JSON 对象的大文本文件。我计划在 Amazon EMR 上使用 Spark 处理这些数据。
以下是我的问题:
最佳答案
只要您使用 pyspark,这应该涵盖 #1:
#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 目录*。如果您使用的是 Spark 集群,导入多个中等大小的文件通常比导入一个大文件要快。对于#2 和#3,我建议查找spark 的 Parquet 支持。您还可以将文本保存回 s3:
my_data.map(lambda x: json.dumps(x)).saveAsTextFile('s3://my-bucket-name/my-new-key')
不知道数据集的大小和管道的计算复杂性,我不能说将中间数据存储到 S3 的方式将是对资源的最佳利用。
*S3 并没有真正的目录,但你知道我的意思。
关于json - 在 Amazon S3 上持久化 RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561889/