以前,为了将数据移动到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/")
有人能帮我解决这个问题吗。
欢迎提出任何建议。谢谢
要复制BLANKSASNULL
和EMPTYASNULL
的功能,请在将其转换为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")
参考文献:
- PySpark在DataFrame上将空值替换为None/null