AWS Glue DynamicFrame将空字符串写入为null问题求助
解决AWS Glue将空字符串转为null导致Redshift非空约束违反的问题
我帮你搞定这个Glue迁移时的坑——Glue默认会把空字符串识别成null,刚好你的RDS和Redshift表都设置了非空约束,这就直接触发违反约束的错误了。下面给你几个实用的解决办法:
1. 直接修改数据源读取参数,禁用空字符串转null的默认行为
这是最直接的解决方案,在读取RDS数据源的时候,通过additionalOptions设置emptyStringAsNull为false,让Glue保留原始的空字符串:
val datasource = glueContext.getCatalogSource( database = "my_rds", tableName = "my_table", redshiftTmpDir = "...", additionalOptions = Map("emptyStringAsNull" -> "false") ).getDynamicFrame()
这个参数会告诉Glue不要把空字符串转换成null,这样写入Redshift的时候,空字符串会被正常写入,不会触发非空约束。
2. 手动转换DynamicFrame中的null值为空字符串
如果第一种方法因为元数据问题没生效,你可以手动处理数据,把可能存在的null值替换成空字符串。先把DynamicFrame转成Spark DataFrame(处理起来更灵活),然后用when函数替换指定字段的null:
import org.apache.spark.sql.functions._ import com.amazonaws.services.glue.DynamicFrame // 转换为DataFrame val df = datasource.toDF() // 替换id和col1字段的null为空字符串 val cleanedDf = df .withColumn("id", when(col("id").isNull, "").otherwise(col("id"))) .withColumn("col1", when(col("col1").isNull, "").otherwise(col("col1"))) // 转回DynamicFrame用于写入Redshift val cleanedDynamicFrame = DynamicFrame(cleanedDf, glueContext)
这样就能确保所有被错误转成null的空字符串都被还原,符合表的非空要求。
3. 检查Glue爬虫生成的元数据是否准确
有时候Glue爬虫可能会误判字段的nullable属性,比如把RDS中not null的字段标记为允许null,这也会导致Glue处理数据时出现偏差。你可以登录AWS Glue控制台,进入Data Catalog查看my_rds.my_table的表结构,确认id和col1的nullable属性是false,如果不是的话手动修改过来,这样Glue读取数据时会更严格地遵循非空约束。
内容的提问来源于stack exchange,提问作者botchniaque
相关产品推荐
相关产品推荐

