Apache spark 使用键[Glue]预定义红移表

Apache spark 使用键[Glue]预定义红移表,apache-spark,pyspark,amazon-redshift,aws-glue,Apache Spark,Pyspark,Amazon Redshift,Aws Glue,我想在第一次写入之前手动定义红移表。这是因为我想在定义的列上利用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

我想在第一次写入之前手动定义红移表。这是因为我想在定义的列上利用
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)
我真的不知道该怎么解释


导致此异常的原因是什么?

异常的原因是内部胶水无法正确解析新行。因此,将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);"\
解决了我遇到的异常

进一步分析日志,似乎在自动生成的粘合
创建表(如果不存在)之后执行粘合
预操作

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)
因此,我用来对这种不便进行排序的方法是使用该库创建连接并执行SQL命令(解释了如何在粘合作业中导入它)