Python 将粘合ETL作业加载到snowflake时出错

Python 将粘合ETL作业加载到snowflake时出错,python,etl,snowflake-cloud-data-platform,aws-glue,Python,Etl,Snowflake Cloud Data Platform,Aws Glue,我正在尝试使用glue ETL将数据从s3存储桶csv文件加载到snowflake中。在ETL作业中编写了一个python脚本,如下所示: import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import Gl

我正在尝试使用glue ETL将数据从s3存储桶csv文件加载到snowflake中。在ETL作业中编写了一个python脚本,如下所示:

    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
    from py4j.java_gateway import java_import
    SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"

    ## @params: [JOB_NAME, URL, ACCOUNT, WAREHOUSE, DB, SCHEMA, USERNAME, PASSWORD]
    args = getResolvedOptions(sys.argv, ['JOB_NAME', 'URL', 'ACCOUNT', 'WAREHOUSE', 'DB', 'SCHEMA', 
    'USERNAME', 'PASSWORD'])
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
    java_import(spark._jvm, "net.snowflake.spark.snowflake")


    spark._jvm.net.snowflake.spark.snowflake.SnowflakeConnectorUtils.enablePushdownSession 
     (spark._jvm.org.apache.spark.sql.SparkSession.builder().getOrCreate())
     sfOptions = {
     "sfURL" : args['URL'],
     "sfAccount" : args['ACCOUNT'],
     "sfUser" : args['USERNAME'],
     "sfPassword" : args['PASSWORD'],
     "sfDatabase" : args['DB'],
     "sfSchema" : args['SCHEMA'],
     "sfWarehouse" : args['WAREHOUSE'],
      }

     dyf = glueContext.create_dynamic_frame.from_catalog(database = "salesforcedb", table_name = 
     "pr_summary_csv", transformation_ctx = "dyf")
     df=dyf.toDF()
     ##df.write.format(SNOWFLAKE_SOURCE_NAME).options(**sfOptions).option("parallelism", 
     "8").option("dbtable", "abcdef").mode("overwrite").save()
     df.write.format(SNOWFLAKE_SOURCE_NAME).options(**sfOptions).option("dbtable", "abcdef").save()
     job.commit()

引发的错误是:

调用o81.save时出错。指定的用户名或密码不正确

但是,如果我不转换为Spark数据帧,直接使用动态帧,我会得到如下错误:

AttributeError:“函数”对象没有属性“格式”

有人能看一下我的代码,告诉我把动态帧转换成DF的错误是什么吗?如果我需要提供更多信息,请告诉我

顺便说一句,我是雪花的新手,这是我通过AWS胶水加载数据的尝试。 调用o81.save时出错。用户名或密码不正确 已指定

错误消息表示用户或密码有错误。如果您确定用户名和密码正确,请确保雪花帐户名和URL也正确

但是,如果我不转换为Spark数据帧,并直接使用 动态帧我得到如下错误:

AttributeError:“函数”对象没有属性“格式”

Glue DynamicFrame的写入方法不同于Spark DataFrame,因此不使用相同的方法是正常的。请检查文档:

您似乎需要将参数作为连接选项提供:

write(connection_type, connection_options, format, format_options, accumulator_size)

connection_options = {"url": "jdbc-url/database", "user": "username", "password": "password","dbtable": "table-name", "redshiftTmpDir": "s3-tempdir-path"} 
即使使用DynamicFrame,最终也可能会出现错误的用户名或密码错误。所以我建议你把注意力集中在修改证书上

调用o81.save时出错。用户名或密码不正确 已指定

错误消息表示用户或密码有错误。如果您确定用户名和密码正确,请确保雪花帐户名和URL也正确

但是,如果我不转换为Spark数据帧,并直接使用 动态帧我得到如下错误:

AttributeError:“函数”对象没有属性“格式”

Glue DynamicFrame的写入方法不同于Spark DataFrame,因此不使用相同的方法是正常的。请检查文档:

您似乎需要将参数作为连接选项提供:

write(connection_type, connection_options, format, format_options, accumulator_size)

connection_options = {"url": "jdbc-url/database", "user": "username", "password": "password","dbtable": "table-name", "redshiftTmpDir": "s3-tempdir-path"} 

即使使用DynamicFrame,最终也可能会出现错误的用户名或密码错误。因此,我建议您专注于修复凭据。

这是经过测试的Glue代码(您可以复制粘贴,因为它只是更改表名),您可以使用它来设置Glue ETL。 您必须添加JDBC和Spark JAR。您可以使用以下链接进行设置:


导入系统 从awsglue.transforms导入* 从awsglue.utils导入getResolvedOptions 从pyspark.context导入SparkContext 从awsglue.context导入GlueContext 从awsglue.job导入作业 从py4j.java_网关导入java_导入 雪花\u SOURCE\u NAME=“net.SNOWFLAKE.spark.SNOWFLAKE”; ##@params:[作业名称、URL、帐户、仓库、数据库、架构、用户名、密码] args=getResolvedOptions(sys.argv,['JOB_NAME','URL','ACCOUNT','WAREHOUSE','DB','SCHEMA','USERNAME','PASSWORD']) sc=SparkContext() glueContext=glueContext(sc) spark=glueContext.spark\u会话 作业=作业(上下文) job.init(args['job\u NAME',args) ##uj=sc.\u jvm.net.snowflake.spark.snowflake spark._jvm.net.snowflake.spark.snowflake.snowflake connectorutils.enablePushdownSession(spark._jvm.org.apache.spark.sql.sparksSession.builder().getOrCreate()) S选项={ “sfURL”:args['URL'], “sfAccount”:args['ACCOUNT'], “sfUser”:args['USERNAME'], “sfPassword”:args['PASSWORD'], “sfDatabase”:args['DB'], “sfSchema”:args['SCHEMA'], “sfWarehouse”:args['WAREHOUSE'], } ##从雪花表读入Spark数据帧 df=spark.read.format(雪花\源\名称)。选项(**sfOptions)。选项(“查询”,“选择*自”)。加载() df.show() ##对数据执行任何类型的转换并另存为新数据帧:df1=df。[插入任何筛选器、转换或其他操作] ##将数据帧内容写入新表df1.Write.format(雪花源名称)。选项(**sfOptions)。选项(“dbtable”,“新表格名称]”))。模式(“覆盖”).save()作业。提交()

这是经过测试的胶水代码(您可以复制粘贴,因为它只是更改表名),您可以使用它来设置胶水ETL。 您必须添加JDBC和Spark JAR。您可以使用以下链接进行设置:


导入系统 从awsglue.transforms导入* 从awsglue.utils导入getResolvedOptions 从pyspark.context导入SparkContext 从awsglue.context导入GlueContext 从awsglue.job导入作业 从py4j.java_网关导入java_导入 雪花\u SOURCE\u NAME=“net.SNOWFLAKE.spark.SNOWFLAKE”; ##@params:[作业名称、URL、帐户、仓库、数据库、架构、用户名、密码] args=getResolvedOptions(sys.argv,['JOB_NAME','URL','ACCOUNT','WAREHOUSE','DB','SCHEMA','USERNAME','PASSWORD']) sc=SparkContext() glueContext=glueContext(sc) spark=glueContext.spark\u会话 作业=作业(上下文) job.init(args['job\u NAME',args) ##uj=sc.\u jvm.net.snowflake.spark.snowflake spark._jvm.net.snowflake.spark.snowflake.snowflake connectorutils.enablePushdownSession(spark._jvm.org.apache.spark.sql.sparksSession.builder().getOrCreate()) S选项={ “sfURL”:args['URL'], “sfAccount”:args['ACCOUNT'], “sfUser”:args['USERNAME'], “sfPassword”:args['PASSWORD'], “sfDatabase”:args['DB'], “sfSchema”:args['SCHEMA'], “sfWarehouse”:args['WAREHOUSE'], } ##从雪花表读入Spark数据帧 df=spark.read.format(雪花\源\名称)。选项(**sfOptions)。选项(“查询”,“选择*自”)。加载() df.show() ##对数据执行任何类型的转换,并另存为新的数据帧:df1=df。[插入任何筛选器,transforma]