【发布时间】:2018-09-29 01:36:45
【问题描述】:
有人知道如何从 S3 存储桶获取动态文件吗?我在 S3 存储桶上设置了一个爬虫,但是我的问题是,每天都会有带有 YYYY-MM-DD-HH-MM-SS 后缀的新文件。
当我通过目录读取表时,它会读取目录中存在的所有文件?是否可以动态选择给定日期的最新三个文件并将其用作 Source?
谢谢!
【问题讨论】:
标签: python amazon-web-services pyspark aws-glue
有人知道如何从 S3 存储桶获取动态文件吗?我在 S3 存储桶上设置了一个爬虫,但是我的问题是,每天都会有带有 YYYY-MM-DD-HH-MM-SS 后缀的新文件。
当我通过目录读取表时,它会读取目录中存在的所有文件?是否可以动态选择给定日期的最新三个文件并将其用作 Source?
谢谢!
【问题讨论】:
标签: python amazon-web-services pyspark aws-glue
如果文件位于同一位置,则无需重新运行爬虫。例如,如果您的数据文件夹是s3://bucket/data/<files>,那么您可以向其中添加新文件并运行 ETL 作业 - 新文件将被自动拾取。
但是,如果数据到达像 s3://bucket/data/<year>/<month>/<day>/<files> 这样的新分区(子文件夹),那么在开始 Glue ETL 作业之前,您需要在 Athena 中运行爬虫或执行 MSCK REPAIR TABLE <catalog-table-name> 以在 Glue 目录中注册新分区。
当数据加载到 DynamicFrame 或 spark 的 DataFrame 中时,您可以应用一些过滤器来仅使用所需的数据。如果您仍想使用文件名,则可以使用input_file_name spark 函数将其添加为列,然后应用过滤:
from pyspark.sql.functions import col, input_file_name
df.withColumn("filename", input_file_name)
.where(col("filename") == "your-filename")
如果您控制文件的发送方式,我建议将它们放入分区(指示日期的子文件夹,即/data/<year>/<month>/<day>/ 或只是/data/<year-month-day>/),以便您可以从在 AWS Glue 中使用 pushdown predicates 中受益
【讨论】: