当我从 Spark 2.0 REPL (spark-shell) 运行以下 Scala 代码时,它会按照我的预期运行,用一个简单的正则表达式拆分字符串。
import org.apache.spark.sql.SparkSession
// Create session
val sparkSession = SparkSession.builder.master("local").getOrCreate()
// Use SparkSQL to split a string
val query = "SELECT split('What is this? A string I think', '\\\\?') AS result"
println("The query is: " + query)
val dataframe = sparkSession.sql(query)
// Show the result
dataframe.show(1, false)
给出预期的输出
+---------------------------------+
|result |
+---------------------------------+
|[What is this, A string I think]|
+---------------------------------+
但是我很困惑是否需要使用双反斜杠而不是单个反斜杠来转义字面问号(这里表示为四个反斜杠,因为在不使用三引号时我们当然必须在 Scala 中转义反斜杠)。
我确认我的一位同事为 Spark 1.5 编写的一些非常相似的代码使用单个(文字)反斜杠就可以正常工作。但是如果我在 Spark 2.1 中只使用一个文字反斜杠,我会从 JVM 的正则表达式引擎中得到错误,"Dangling meta character '?' near index 0"
. 我知道这意味着问号没有正确转义,但它闻起来像反斜杠本身必须先转义,然后再转义 Scala 。
我猜这对于将控制字符(如换行符)插入 SQL 查询本身很有用。如果这从 Spark 1.5 更改为 2.1,我只是感到困惑?
我为此搜索了很多,但没有找到任何东西。要么发生了一些变化,要么我同事的代码以意想不到的方式工作。
我也用 Python/pyspark 尝试过这个,同样的条件适用 - SQL 中需要双反斜杠。
谁能解释一下?
我在 Windows 上运行相对简单的设置,使用 Spark 2.1.0、JDK 1.8.0_111 和 Hadoop winutils.exe。