将数据移动到Redshift表时,无法在write_dynamic_frame.from_catalog中使用BLANK



以前,为了将数据移动到Redshift表,我们使用"复制">具有数据转换参数功能的命令,如BLANKSASNULL和EMPTYASNULL

由于我们的数据包含";空字符串";以及";Null";值,我们过去在移动到Redshift表时将两者都转换为Null如下所示。示例代码:

COPY Database.Table 
FROM 's3:/folder/file.csv' 
IAM_ROLE 'arn:aws:iam::0000000:role/RedshiftCopyUnload'
DELIMITER ',' ESCAPE
REMOVEQUOTES
ACCEPTINVCHARS
EMPTYASNULL
BLANKSASNULL
NULL AS 'NULL'
DATEFORMAT 'auto';

现在,我们不得不使用write_dynamic_frame.from_jdbc_conf方法,我们正在尝试复制相同的方法(复制命令数据转换参数,如**BLANKSASNULL和EMPTYASNULL(,但我们无法找到确切的引用。

# Save data to Redshift
redshift_save_options = {
"dbtable": "Database." + TableName,
"database": "Schema"
}
from awsglue.dynamicframe import DynamicFrame
x = DynamicFrame.fromDF(input_data, glueContext, "dfx")
glueContext.write_dynamic_frame.from_jdbc_conf(
frame = x, 
catalog_connection = "Regshift-glue-connection", 
connection_options = redshift_save_options, 
redshift_tmp_dir = "s3:/project/RedshiftTempDirectory/")

有人能帮我解决这个问题吗。

欢迎提出任何建议。谢谢

要复制BLANKSASNULLEMPTYASNULL的功能,请在将其转换为DynamicFrame之前,替换DataFrame(即input_data(中的空白列和空列。

示例:

from pyspark.sql.functions import col, when
# replace empty strings values
# calling strip() handles "blank" strings (i.e. handles new line characters, etc)
input_data = input_data.select(
[
when(col(c).strip() == "", None).otherwise(col(c)).alias(c) for c in input_data.columns
]
)
x = DynamicFrame.fromDF(input_data, glueContext, "dfx")

参考文献:

  1. PySpark在DataFrame上将空值替换为None/null

最新更新