Spark 2.0.0 усекает таблицу Redshift с помощью jdbc

Здравствуйте, я использую Spark SQL (2.0.0) с Redshift, где я хочу обрезать свои таблицы. Я использую этот пакет spark-redshift и хочу знать, как я могу обрезать свою таблицу. Может ли кто-нибудь поделиться примером этого ??


person Akki    schedule 05.12.2016    source источник


Ответы (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
comment
что в предоставленном коде позволяет пользователю обрезать любую таблицу? подразумевается, что my_dataframe является пустым фреймом данных? - person CedricB; 02.03.2018
comment
.mode("overwrite") приведет к удалению существующих данных. Пользователь, указанный в URL-адресе Redshift, должен иметь необходимые разрешения, иначе произойдет ошибка. - person Joe Harris; 02.03.2018
comment
предположительно my_dataframe построен на my_table? если это предположение верно, я думаю, что .mode(overwrite) запишет все данные из my_table обратно в мою таблицу и фактически ничего не обрезает. что мне не хватает? - person CedricB; 03.03.2018