regexp_replace 添加 space 时超出 Pyspark 错误 DDL 长度

Pyspark error DDL length exceeded when regexp_replace with added space

这真的很奇怪,当我将 \n 和 \r 字符替换为没有 space 时,此代码有效。但是当我使用 space、
“”、或“\s”、或“\s”、或“[\s]”或“-”时(我已经尝试了一切) 然后根据 Redshift 导致字符串超出长度。所以 stl_load_errors 表示超出了 ddl 长度,但是当我从数据框中获取文本时,甚至从 stl_load_errors table 中获取文本时,它只显示 1024 个字符。该字段设置为 varchar(1026)。

作品:

rootTable.withColumn("firstfield",substring(regexp_replace("firstvalue","[\r\n]", ""), 1,1026)) \
                    .withColumn("secondfield",substring(regexp_replace("secondvalue","[\r\n]", ""), 1,1026))

无效:

rootTable.withColumn("firstfield",substring(regexp_replace("firstvalue","[\r\n]", " "), 1,1026)) \
                    .withColumn("secondfield",substring(regexp_replace("secondvalue","[\r\n]", " "), 1,1026))

我是不是把字符和字节搞混了,比如 RS table 是 1026 字节,而不是字符?

数据样本中有一些 \n \r 内容:...Non-applicable\nSubstances...

如果我将子字符串更改为 1014 左右,那么它会插入 ok,没有超出 ddl 长度。

谢谢

编辑: 这似乎是由于文本中存在特殊字符或大于 1 个字节的字符。当我找到解决方案时会分享

通过大量研究,我找不到一种优雅的方式来处理这个问题。删除非 ascii 字符是唯一的方法。对于非 ascii,长度不可预测。在这种情况下,这可能会导致 Redshift 中的 ddl 长度超出错误。

pyspark 子字符串方法无法正确处理我的问题。如果我正在处理二进制数据,我想它会,但是来回转换它并尝试用 1 字节值替换每个值似乎在这种情况下需要太多工作。

def ascii_ignore(x):
    return x.encode('ascii', 'ignore').decode('ascii') if x else None