使用Scala提取嵌入式AWS Glue连接凭证

问题描述

我有一个胶粘作业,可以直接从redshift读取数据,为此,必须提供连接凭据。我创建了一个嵌入式胶粘连接,可以使用以下 pyspark 代码提取凭据。有没有办法在 Scala 中做到这一点?

glue = boto3.client('glue',region_name='us-east-1')
    
response = glue.get_connection(
    Name='name-of-embedded-connection',HidePassword=False 
)
    
table = spark.read.format(
    'com.databricks.spark.redshift'
).option(
    'url','jdbc:redshift://prod.us-east-1.redshift.amazonaws.com:5439/db'
).option(
    'user',response['Connection']['ConnectionProperties']['USERNAME']
).option(
    'password',response['Connection']['ConnectionProperties']['PASSWORD']
).option(
    'dbtable','db.table'
).option(
    'tempdir','s3://config/glue/temp/redshift/'
).option(
    'forward_spark_s3_credentials','true'
).load()

解决方法

AWS没有等效的Scala来发出此API调用。但是您可以按照本answer所述在scala中使用Java SDK代码。

ThisgetConnection的Java SDK调用,如果您不想这样做,则可以采用以下方法:

  1. 创建AWS Glue python shell作业并检索连接信息。

  2. 一旦有了值,就调用另一个scala Glue作业,并将这些作为参数在python shell作业内,如下所示:

glue = boto3.client('glue',region_name ='us-east-1')

response = glue.get_connection(
    Name='name-of-embedded-connection',HidePassword=False 
)

response = client.start_job_run(
               JobName = 'my_scala_Job',Arguments = {
                 '--username': response['Connection']['ConnectionProperties']['USERNAME'],'--password': response['Connection']['ConnectionProperties']['PASSWORD'] } )
  1. 然后使用getResolvedOptions在scala作业中访问这些参数,如下所示:

导入com.amazonaws.services.glue.util.GlueArgParser

val args = GlueArgParser.getResolvedOptions(
  sysArgs,Array(
    "username","password")
)
val user = args("username")
val pwd  = args("password")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...