Databricks 使用来自 Secrets 的 sql jdbc 参数导致 ParseError

问题描述 投票:0回答:1

我有一些用于连接到外部数据库的数据块秘密。但是,我希望在 sql 单元格或

spark.sql()
函数中使用秘密,结果是
ParseError

我正在尝试使用我的databricks密钥来存储AWS RDS凭证(主机/端口/数据库/用户/密码)

如果我将它们作为秘密并在 pyspark 上使用它们,就像这样,它会起作用:

HOST=dbutils.secrets.get(scope='sample',key='host')
PORT=dbutils.secrets.get(scope='sample',key='port')
DATABASE=dbutils.secrets.get(scope='sample',key='database')
USER=dbutils.secrets.get(scope='sample',key='username')
PASSWORD=dbutils.secrets.get(scope='sample',key='password')

jdbc_url="jdbc:postgresql://{}/{}".format(HOST,DATABASE)
conn_properties={'user':USER,'password':PASSWORD}

df=spark.read.format('jdbc')\
    .option("url", jdbc_url) \
    .option("query", 'SELECT * FROM some_table') \
    .option("user", USER) \
    .option("password", PASSWORD)\
    .load()

现在,在 SQL 单元上,我也想将这些参数作为秘密引用。例如,我在 sql 单元上有这个 sql 语句来连接到 RDS 上的表

%sql 
CREATE TEMPORARY VIEW test
USING JDBC
OPTIONS (
  url '<hardcoded_jdb_url_with_visible_values>',
  dbtable 'some_schema.some_table',
  user '<hardcoded_user_visible_values>',
  password '<hardcoded_visible_password_plain_text>'
)

如何避免在 sql 语句上对它们进行硬编码,并仍然将它们引用为我上面提取的秘密,例如

HOST
PORT
DATABASE
USER
PASSWORD

我在 python 单元上尝试过这个,但是失败了:

HOST=dbutils.secrets.get(scope='sample',key='host')
PORT=dbutils.secrets.get(scope='sample',key='port')
DATABASE=dbutils.secrets.get(scope='sample',key='database')
USER=dbutils.secrets.get(scope='sample',key='username')
PASSWORD=dbutils.secrets.get(scope='sample',key='password')

jdbc_url="jdbc:postgresql://{}/{}".format(HOST,DATABASE)

spark.sql(f'''
CREATE TEMPORARY VIEW test
USING JDBC
OPTIONS (
  url {jdbc_url},
  dbtable 'some_schema.some_table
  user {USER},
  password {PASSWORD}
)
'''
)

我收到的错误只是

ParseError
,没有更多消息

如果我

print(jdbc_url)
,当然,因为这是一个秘密,这就是控制台中显示的内容
jdbc:postgresql://[REDACTED]/[REDACTED]

pyspark databricks amazon-rds
1个回答
0
投票

您的变量缺少引号,应该是:

spark.sql(f'''
CREATE TEMPORARY VIEW test
USING JDBC
OPTIONS (
  url '{jdbc_url}',
  dbtable 'some_schema.some_table',
  user '{USER}',
  password '{PASSWORD}'
)
''')
© www.soinside.com 2019 - 2024. All rights reserved.