Здравствуйте, я использую Spark SQL (2.0.0) с Redshift, где я хочу обрезать свои таблицы. Я использую этот пакет spark-redshift и хочу знать, как я могу обрезать свою таблицу. Может ли кто-нибудь поделиться примером этого ??
Spark 2.0.0 усекает таблицу Redshift с помощью jdbc
Ответы (2)
Мне не удалось сделать это с помощью Spark и кода в репозитории spark-redshift, который вы указали выше.
Однако я смог использовать AWS Lambda с psycopg2 для усечения таблицы красного смещения. Затем я использую boto3, чтобы запустить свою искровую работу через AWS Glue.
Ниже приведен важный код: cur.execute("truncate table yourschema.yourtable").
from __future__ import print_function
import sys
import psycopg2
import boto3
def lambda_handler(event, context):
db_database = "your_redshift_db_name"
db_user = "your_user_name"
db_password = "your_password"
db_port = "5439"
db_host = "your_redshift.hostname.us-west-2.redshift.amazonaws.com"
try:
print("attempting to connect...")
conn = psycopg2.connect(dbname=db_database, user=db_user, password=db_password, host=db_host, port=db_port)
print("connected...")
conn.autocommit = True
cur = conn.cursor()
count_sql = "select count(pivotid) from yourschema.yourtable"
cur.execute(count_sql)
results = cur.fetchone()
print("countBefore: ", results[0])
countOfPivots = results[0]
if countOfPivots > 0:
cur.execute("truncate table yourschema.yourtable")
print("truncated yourschema.yourtable")
cur.execute(count_sql)
results = cur.fetchone()
print("countAfter: ", results[0])
cur.close()
conn.close()
glueClient = boto3.client("glue")
startTriiggerResponse = glueClient.start_trigger(Name="your-awsglue-ondemand-trigger")
print("startedTrigger:", startTriiggerResponse.Name)
return results
except Exception as e:
print(e)
raise e
person
CedricB
schedule
15.03.2018
Перед вызовом сохранения необходимо указать mode
в библиотеке. Например:
my_dataframe.write
.format("com.databricks.spark.redshift")
.option("url", "jdbc:redshift://my_cluster.qwertyuiop.eu-west-1.redshift.amazonaws.com:5439/my_database?user=my_user&password=my_password")
.option("dbtable", "my_table")
.option("tempdir", "s3://my-bucket")
.option("diststyle", "KEY")
.option("distkey", "dist_key")
.option("sortkeyspec", "COMPOUND SORTKEY(key_1, key_2)")
.option("extracopyoptions", "TRUNCATECOLUMNS COMPUPDATE OFF STATUPDATE OFF")
.mode("overwrite") // "append" / "error"
.save()
person
Joe Harris
schedule
06.12.2016
что в предоставленном коде позволяет пользователю обрезать любую таблицу? подразумевается, что my_dataframe является пустым фреймом данных?
- person CedricB; 02.03.2018
.mode("overwrite")
приведет к удалению существующих данных. Пользователь, указанный в URL-адресе Redshift, должен иметь необходимые разрешения, иначе произойдет ошибка.
- person Joe Harris; 02.03.2018
предположительно my_dataframe построен на my_table? если это предположение верно, я думаю, что .mode(overwrite) запишет все данные из my_table обратно в мою таблицу и фактически ничего не обрезает. что мне не хватает?
- person CedricB; 03.03.2018