使用键[Glue]

我想在第一次写入之前手动定义Redshift表。这是因为我想在定义的列上使用distkeysortkey。 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参数(不幸提到了here,不幸的是找不到更好的文档),

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)

我真的不知道该怎么解释。

是什么导致此异常?

xwhses 回答:使用键[Glue]

出现异常的原因是因为内部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,type VARCHAR(MAX)) sortkey(id)

因此,我用来对这种不便进行排序的方法是使用psycopg2创建连接并通过该库执行SQL命令(here解释了如何将其导入到Glue Job中)

本文链接:https://www.f2er.com/3150628.html

大家都在问