如何指定显式架构AWS Glue PySpark和使用书签

时间:2019-06-05 15:54:05

标签: amazon-web-services pyspark aws-glue

通读AWS Glue Python ETL文档,当使用以下DynamicFrameReder类并从s3读取json文件时,我无法确定是否有提供显式架构的方法:

create_dynamic_frame_from_options()

此外,使用上面指定的DynamicFrameReader类是否需要添加书签?

我问的原因是,我总是可以使用普通的PySpark进行阅读并以这种方式传递模式,但是我不确定是否不使用Glue函数就能进行书签功能。

3 个答案:

答案 0 :(得分:0)

目前尚不清楚您要处理的文件类型。如果是csv,则胶水应该能够根据标头推断模式,前提是您给了它正确的格式选项。

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html

如果推断模式对您不起作用,则适用于任何数据集的一种方法是创建粘合目录数据库和表。如果搜寻器可以工作,那可能是创建(和维护)该架构的最简单方法。但是,如果您无法使用搜寻器,则也可以手动创建表及其架构。然后,您可以使用create_dynamic_frame_from_catalog,并且在创建动态框架时,将使用数据目录中的架构。

您正确地假设不使用粘合功能便无法添加书签。

答案 1 :(得分:0)

使用DynamicFrameReader时,您可以在schema中提供的dbtable参数中指定connection_options,如下所示:

datasource0 = glueContext\
              .create_dynamic_frame\
              .from_options("redshift", 
                           {"url": "jdbc-url/database", 
                           "user": "username", 
                           "password": "password",
                           "dbtable": "schema.table-name", 
                            "redshiftTmpDir": "s3-tempdir-path"},
                            transformation_ctx = "datasource0")

为了使书签起作用,您需要使用AWS Glue方法并定义transformation_ctx。在Documentation之后,您将找到以下内容:

  

为使工作书签正常工作,请启用工作书签参数并设置Transformation_ctx参数。如果不传递transformation_ctx参数,则不会为该方法中使用的动态框架或表启用作业书签。

请注意,作业书签仅适用于s3数据源,而关系数据库的用例有限。

答案 2 :(得分:0)

到目前为止,我已经连续1个月在这个地方了。 鉴于您需要:

  • 使用书签功能
  • 并从没有标题信息的s3中获取数据

对不起,您遇到了死胡同。 在读取csv或json文件甚至事后(使用Glue API)时,根本没有添加模式的选项。如果这不再适用,请发表评论

如@Aida Martinez所述,您可以使用搜寻器来创建架构(表),或者通过Glue控制台或通过运行Athena的“创建表...”脚本来手动创建表。

与@Aid Martinez的评论相反,我相信如果您从Kafka Connect接收文件,则书签将起作用,因为s3上的文件将带有其创建/修改日期的时间戳。而Glue书签会将其作为默认的书签密钥,只要您设置了transform_ctx,就可以进行书签。