问题描述
我有一个胶粘作业,可以直接从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代码。
This是getConnection
的Java SDK调用,如果您不想这样做,则可以采用以下方法:
-
创建AWS Glue python shell作业并检索连接信息。
-
一旦有了值,就调用另一个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'] } )
- 然后使用getResolvedOptions在scala作业中访问这些参数,如下所示:
导入com.amazonaws.services.glue.util.GlueArgParser
val args = GlueArgParser.getResolvedOptions(
sysArgs,Array(
"username","password")
)
val user = args("username")
val pwd = args("password")