我有一些用于连接到外部数据库的数据块秘密。但是,我希望在 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]
您的变量缺少引号,应该是:
spark.sql(f'''
CREATE TEMPORARY VIEW test
USING JDBC
OPTIONS (
url '{jdbc_url}',
dbtable 'some_schema.some_table',
user '{USER}',
password '{PASSWORD}'
)
''')