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 ;??? ;??? ;???
这是我目前用于转义和加入属性的代码。假设 attributes
是 List<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
COPY loads \n as a newline character and loads \t as a tab character.
To load a backslash, escape it with a backslash ( \ ).
在我的应用程序中,我获取一些事件,将它们写入日志文件,然后将它们写入 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 ;??? ;??? ;???
这是我目前用于转义和加入属性的代码。假设 attributes
是 List<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
COPY loads \n as a newline character and loads \t as a tab character. To load a backslash, escape it with a backslash ( \ ).