当我从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.
我猜这可以用于将控制字符(如换行符)插入SQL查询本身.如果这已经从Spark 1.5改为2.1,我只是感到困惑?
我已经搜索了相当多的东西,但没有找到任何东西.要么发生了变化,要么我的同事的代码以无意的方式运行.
我也尝试使用Python/pyspark,并且适用相同的条件 - SQL中需要双反斜杠.
有谁能解释一下?
我在Windows上运行相对简单的设置,包括Spark 2.1.0,JDK 1.8.0_111和Hadoop winutils.exe.