在我们的项目中,我们使用Scala和Spark将数据从RDBMS上的表移至HDFS。在移动数据之前,我们在数据上应用“ regex_replace”以消除数据中的某些差异。下面是regex_replace:
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(..., E'[\\n]+', ' ', 'g' ),
E'[\\r]+', ' ', 'g'
),
E'[\\t]+', ' ', 'g'
),
E'[\\cA]+', ' ', 'g'
),
E'[\\ca]+', ' ', 'g'
)
在每次E
调用中,单引号之前的regexp_replace
是什么意思?
答案 0 :(得分:1)
'E'是SQL语法at least for PostgreSql的一部分。
它在SQL中用于能够使用反斜杠\
来转义字符。
并且如果将这样的SQL字符串放在scala字符串(不是raw string)中,则需要对反斜杠进行反斜杠以获得文字反斜杠。
那么要使regex_replace函数中的正则表达式只看到一个文字反斜杠吗?
val sqlstring = "select regexp_replace(col1, E'\\\\s+','','g') as col1_without_whitespace from yourtable"
等效于:
val sqlstring = "select regexp_replace(col1, '\\s+','','g') as col1_without_whitespace from yourtable"
等效于:
val sqlstring = raw"select regexp_replace(col1, '\s+','','g') as col1_without_whitespace from yourtable"
可以找到{E'3}的SQL Fiddle测试“ E”