AWS Glue:ETL读取S3 CSV文件

时间:2018-11-01 15:10:05

标签: amazon-web-services amazon-s3 etl aws-glue

我想使用ETL从S3读取数据。由于有了ETL作业,我可以将DPU设置为希望加快处理速度。

但是我该怎么做呢?我尝试过

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

inputGDF = glueContext.create_dynamic_frame_from_options(connection_type = "s3", connection_options = {"paths": ["s3://pinfare-glue/testing-csv"]}, format = "csv")
outputGDF = glueContext.write_dynamic_frame.from_options(frame = inputGDF, connection_type = "s3", connection_options = {"path": "s3://pinfare-glue/testing-output"}, format = "parquet")

但是似乎没有写任何东西。我的文件夹如下:

enter image description here

什么不对?我的输出S3只有一个文件:testing_output_$folder$

2 个答案:

答案 0 :(得分:0)

我认为这里的问题是您在testing-csv文件夹中有子文件夹,并且由于您未指定递归为真,因此Glue无法在2018-09-中找到文件26个子文件夹(或实际上任何其他子文件夹)。

您需要添加以下递归选项

inputGDF = glueContext.create_dynamic_frame_from_options(connection_type = "s3", connection_options = {"paths": ["s3://pinfare-glue/testing-csv"], "recurse"=True}, format = "csv")

此外,关于注释中有关爬网程序的问题,它们有助于推断数据文件的架构。因此,在您的情况下,由于您是直接从s3创建dynamicFrame的,因此这里什么也不做。

答案 1 :(得分:-3)

如果您正在读取或写入S3存储桶,则存储桶名称应带有aws-glue * 胶水访问存储桶的前缀。假设您使用的是预先配置的 IAM角色“ AWSGlueServiceRole”,仔细查看政策详细信息将回答原因 胶水的工作方式就是这样。以下是默认的“ AWSGlueServiceRole”策略JSON。一世 我只是保留s3相关部分以使其简短以用于演示目的。尽你所能 看到,s3 Get / List存储桶方法可以访问所有资源,但是当涉及到 获取/放置*对象,仅限于“ aws-glue- / ”前缀

我写了blog,涉及一些可能有用的AWS陷阱。

如果有任何错误消息并且我提出的解决方案不起作用,也可以粘贴日志吗?

相关问题