在 PySpark Databricks 中重命名 redshift SQL table

Rename a redshift SQL table within PySpark Databricks

我想在 Python Databricks notebook 中重命名 redshift table。

目前我有一个提取数据并创建 table:

的查询
redshiftUrl = 'jdbc:redshift://myredshifturl'

redshiftOptions = {
  'url':          redshiftUrl,
  'aws_iam_role': 'myredshift_iam_role',
  'tempdir':      's3bucket',
}

def run_query(query_string):
  # returns a df
  return spark.read.format('com.databricks.spark.redshift').options(**redshiftOptions).option('query', query_string)

query = """
SELECT TOP 100 * FROM public.mytable
"""

df = run_query(query).load()

def write_table(src_table, table_name=None, write_mode='overwrite', diststyle=None, distkey=None, sortkeyspec=None, preactions=None, postactions=None):
  srcDf = src_table
  loadOptions = redshiftOptions
  loadOptions['tempformat'] = 'CSV GZIP'
  loadOptions['extracopyoptions'] = 'truncatecolumns'
  if diststyle:
    loadOptions['diststyle'] = diststyle
  if distkey:
    loadOptions['diststyle'] = 'key'
    loadOptions['distkey'] = distkey
  if sortkeyspec:
    loadOptions['sortkeyspec'] = sortkeyspec
  if preactions:
    loadOptions['preactions'] = preactions
  if postactions:
    loadOptions['postactions'] = postactions
  if table_name == None: table_name = src_table
  srcDf.write.format('com.databricks.spark.redshift').options(**loadOptions).option('dbtable', table_name).mode(write_mode).save()

write_table(df, table_name = 'public.test')

我想把这个 table 我创建的并重命名。我引用了 this doc 但发现很难理解。

我想在我的 pyspark databricks 笔记本中 运行 这个 SQL 命令 alter table public.test rename to test_table_to_be_dropped。 (此命令在我的 SQL IDE 中有效)

这是我尝试过的方法:

test_query = """
alter table public.test rename to test_table_to_be_dropped
"""
run_query(test_query).load()

这给了我一个错误:

java.sql.SQLException: [Amazon](500310) Invalid operation: syntax error at or near "table" 

这让我相信我的 run_query() 功能仅用于读取数据而不用于编辑数据。我还看到我可以使用 %sql 魔法命令,但看起来它只会引用我的数据湖而不是我的 redshift 数据库。

TL;DR: 有没有办法我可以编写一个函数来使用 sql 写入命令或指向我的 %sql 魔法命令来引用我的 redshift table?

我想在我的 pyspark databricks 笔记本中 运行 这个 SQL 命令 alter table public.test rename to test_table_to_be_dropped。 (此命令在我的 SQL IDE 中有效)

A​​WS Redshift 有一个 postactionspreactions parameter,允许您在写入查询后写入 SQL 查询。

def write_table(src_table, table_name=None, diststyle=None, distkey=None, sortkeyspec=None, preactions=None, postactions=None):
  srcDf = src_table
  loadOptions = redshiftOptions
  loadOptions['tempformat'] = 'CSV GZIP'
  loadOptions['extracopyoptions'] = 'truncatecolumns compupdate off'
  if diststyle:
    loadOptions['diststyle'] = diststyle
  if distkey:
    loadOptions['diststyle'] = 'key'
    loadOptions['distkey'] = distkey
  if sortkeyspec:
    loadOptions['sortkeyspec'] = sortkeyspec
  if preactions:
    loadOptions['preactions'] = preactions
  if postactions:
    loadOptions['postactions'] = postactions
  if table_name == None: table_name = src_table
  srcDf.write.format('com.databricks.spark.redshift').options(**loadOptions).option('dbtable', table_name).mode('overwrite').save()
sql_query = """
ALTER TABLE some sql actions;
DROP TABLE mytable
"""

write_table(df,table_name=mytable,postactions=sql_query)