我有一个status_changes的日志文件,每个文件都有一个driver_id,timestamp和duration。使用driver_id和timestamp,我想从S3获取适当的GPS日志。这些GPS日志以bucket_name / yyyy / mm / dd / driver_id.log的形式存储在S3存储桶中。
from mrjob.job import MRJob
class Mileage(MRJob):
def get_s3_gpslog_path(self, driver_id, occurred_at, status):
s3_path = "s3://gps_logs/{yyyy}/{mm}/{dd}/{driver_id}.log"
s3_path = s3_path.format(yyyy=occurred_at.year,
mm=occurred_at.month,
dd=occurred_at.day,
driver_id=driver_id)
return s3_path
def mapper(self, _, line):
line = ast.literal_eval(line)
driver_id = line['driverId']
occurred_at = line['timestamp']
status = line['status']
s3_path = self.get_s3_gpslog_path(driver_id, occurred_at, status)
# ^^ How do I fetch this file and read it?
distance = calculate_distance_from_gps_log(s3_path, occurred_at, status)
yield status, distance
if __name__ == '__main__':
Mileage.run()
从命令行我使用status_change日志文件作为输入运行它: $ python mileage.py status_changes.log
我的问题是:考虑到我构建的S3 URI字符串,我如何实际获取GPS日志?
答案 0 :(得分:0)
您可以使用属于mrjob的S3Filesystem。您也可以在脚本中使用boto的S3实用程序。您可能需要对(秘密)访问密钥进行硬编码(或从每个节点中的Hadoop配置解析)。但是,映射器正在做的事情可能有点过多,可能会过多地请求获取S3资源。您可以通过在GPS日志中与其他日志一起流式传输来重写MapReduce算法,从而以较少资源密集的方式进行连接。