首页 > 解决方案 > 使用 pyspark 从数据块中删除红移表

问题描述

我尝试连接到一个名为 stv_sessions 的红移系统表,我可以将数据读入数据帧。

此 stv_sessions 表是一个 redshift 系统表,其中包含当前正在运行的所有查询的进程 ID。

要从运行中删除查询,我们可以这样做。

select pg_terminate_backend(pid)

如果我直接连接到 redshift(使用 aginity),这对我有用,但在尝试从数据块运行时,它会给我带来不足的特权问题。

简而言之,我不知道如何从 databricks 笔记本运行查询。

到目前为止我已经尝试过了,

kill_query = "select pg_terminate_backend('12345')" 

some_random_df_i_created.write.format("com.databricks.spark.redshift").option("url",redshift_url).option("dbtable","stv_sessions").option("tempdir", temp_dir_loc).option("forward_spark_s3_credentials", True).options("preactions", kill_query).mode("append").save()

请让我知道我遵循的方法是否正确。

谢谢

标签: pysparkamazon-redshiftdatabrickspyspark-dataframes

解决方案


Databricks 故意不预包含此驱动程序。您需要下载并安装适用于 databricks 的官方 Redshift JDBC 驱动程序。:下载官方 Amazon Redshift JDBC 驱动程序,将其上传到 Databricks,并将库附加到您的集群。(建议使用 v1.2.12 或更低版本的 Databricks 集群)。然后,使用表单的 JDBC URL

val jdbcUsername = "REPLACE_WITH_YOUR_USER"
val jdbcPassword = "REPLACE_WITH_YOUR_PASSWORD"
val jdbcHostname = "REPLACE_WITH_YOUR_REDSHIFT_HOST"
val jdbcPort = 5439
val jdbcDatabase = "REPLACE_WITH_DATABASE"
val jdbcUrl = s"jdbc:redshift://${jdbcHostname}:${jdbcPort}/${jdbcDatabase}?user=${jdbcUsername}&password=${jdbcPassword}"
jdbcUsername: String = REPLACE_WITH_YOUR_USER
jdbcPassword: String = REPLACE_WITH_YOUR_PASSWORD
jdbcHostname: String = REPLACE_WITH_YOUR_REDSHIFT_HOST
jdbcPort: Int = 5439
jdbcDatabase: String = REPLACE_WITH_DATABASE
jdbcUrl: String = jdbc:redshift://REPLACE_WITH_YOUR_REDSHIFT_HOST:5439/REPLACE_WITH_DATABASE?user=REPLACE_WITH_YOUR_USER&password=REPLACE_WITH_YOUR_PASSWORD

然后尝试将 jdbcUrl 代替您的 redshift_url。这可能是您遇到特权问题的唯一原因。

链接1:https://docs.databricks.com/_static/notebooks/redshift.html 链接2:https : //docs.databricks.com/data/data-sources/aws/amazon-redshift.html#installation

另一个原因可能是 redshift-databricks 连接器仅使用 SSL(飞行中加密),并且可能已在您的 redshift 集群上设置了 IAM 角色以仅允许某些用户删除表。

如果这些都对您的情况没有帮助,我们深表歉意。


推荐阅读