gpt4 book ai didi

apache-spark - 为什么 SparkSQL 在 SQL 查询中需要两个文字转义反斜杠?

转载 作者:行者123 更新时间:2023-12-04 21:07:36 26 4
gpt4 key购买 nike

当我从 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。

最佳答案

可能是因为反斜杠是一个特殊符号,用于连接多行 SQL。

sql_1 = spark.sql("SELECT \
1 AS `col1`, '{0}' AS `col2`".format(var_1))

关于apache-spark - 为什么 SparkSQL 在 SQL 查询中需要两个文字转义反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com