在 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 中有效)
AWS Redshift 有一个 postactions
和 preactions
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)
我想在 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 中有效)
AWS Redshift 有一个 postactions
和 preactions
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)