Redshift 的定界符转义边缘案例

Delimeter-escaping edge case for Redshift

在我的应用程序中,我获取一些事件,将它们写入日志文件,然后将它们写入 redshift。下面的文件显示了三种情况。在一种情况下,一切正常,没有使用管道。第二个用例有一个管道,但它转义得很好。然而,第三种情况有点诡异。 Event.x=Hi\|,所以这意味着转义它会产生 Hi\|,我不知道 Redshift 将如何解释它。它会 a) 将其解释为转义的反斜杠,并将管道解释为常规定界符(坏)吗?或 b) 仅查看管道前的反斜杠并仍然避开管道(好)?

In my Java code   ;Logfile Text  ;Redshift columns     ;Works
--------------------------------------------------------------
Event.x ;Event.y  ;Logfile Text  ;Column X  ;Column Y  ;Works
--------------------------------------------------------------
Hi      ;10       ;Hi|10         ;Hi        ;10        ;Yes
--------------------------------------------------------------
Hi|     ;10       ;Hi\||10       ;Hi|       ;10        ;Yes
--------------------------------------------------------------
Hi\|    ;10       ;Hi\||10      ;???       ;???       ;???

这是我目前用于转义和加入属性的代码。假设 attributesList<String>.

String log = attributes.stream()
    .map(s -> s.replace("|", "\|"))    // Escape existing delimiters
    .collect(Collectors.joining("|"));  // Join on pipes

需要转义转义和转义管道:"\|" -> "\\|"

例如

.map(s -> s.replace("\", "\\"))  // Escape escapes
.map(s -> s.replace("|", "\|"))    // Escape existing delimiters

来自redshift docs

COPY loads \n as a newline character and loads \t as a tab character. To load a backslash, escape it with a backslash ( \ ).