Заранее определите таблицу Redshift с помощью клавиш [Glue] - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу определить таблицу Redshift вручную перед моей первой записью. Это потому, что я хочу использовать distkey и sortkey для определенных столбцов. SQL-запрос будет выглядеть примерно так:

my_sql_command = """
    create table if not exists my_db.my_schema.my_table(
        my_id                     VARCHAR(MAX) NOT NULL DISTKEY,
        type                      VARCHAR(MAX),
        my_timestamp  TIMESTAMP,
    )
    compound sortkey(my_timestamp, my_id);
    """

Я называю эту строку SQL параметром preactions (упомянуто здесь , не могу найти лучшую документациюк сожалению) вот так:

my_frame = DynamicFrame.fromDF(my_df, glue_context, "my_frame")

glue_context.write_dynamic_frame.from_jdbc_conf(
        frame=my_frame, catalog_connection=params['db_connection_name'],
        connection_options={"preactions": my_sql_command, "dbtable": "my_schema.my_table", "database": "my_db"},
        redshift_tmp_dir="s3://my_bucket/", transformation_ctx="my_ctx")

Но я получаю это сообщение об ошибке:

py4j.protocol.Py4JJavaError: An error occurred while calling o227.pyWriteDynamicFrame.
: java.sql.SQLException: [JDBC Driver]String index out of range: 0
at java.lang.String.charAt(String.java:658)

, которое я действительно не знаю, как интерпретировать.

Что вызываетэто исключение?

1 Ответ

0 голосов
/ 06 ноября 2019

Причина исключения в том, что Glue внутренне неправильно анализирует новые строки. Поэтому переписывание команды SQL в виде

my_sql_command = "create table if not exists my_db.my_schema.my_table("\
        "my_id         VARCHAR(MAX) NOT NULL DISTKEY, "\
        "type          VARCHAR(MAX), "\
        "my_timestamp  TIMESTAMP) "\
    "compound sortkey(my_timestamp, my_id);"\

разрешило возникшее исключение.

Кроме анализа журналов, похоже, что Glue preaction выполняется после того, какКлей автоматически сгенерированный CREATE TABLE IF NOT EXISTS:

19/11/11 11:11:11 INFO RedshiftWriter: 
CREATE TABLE IF NOT EXISTS my_schema.my_table (my_id VARCHAR(MAX), my_timestamp TIMESTAMP, type VARCHAR(MAX)) DISTSTYLE EVEN
19/11/11 11:11:11 INFO RedshiftWriter: Executing preAction: 
create table if not exists my_schema.my_table(my_id VARCHAR(MAX) NOT NULL DISTKEY, my_timestamp TIMESTAMP, type VARCHAR(MAX)) sortkey(id)

Таким образом, подход, который я использовал для устранения этого неудобства, заключается в создании соединения с использованием psycopg2 и выполнении команды SQL черезэта библиотека ( здесь объяснила, как импортировать ее в Клеевое задание)

...