SPARK:如果值中同时存在单引号和双引号,则数据框 Select 表达式无法执行追加操作

SPARK : Data frame Select expression failed to do append operation if both single quote and double quote present in the value

我的场景解释如下:-(下面的实验尝试使用 Spark Shell)

我有一个包含客户 ID 和客户名称列的数据框。现在我想通过 Spark UDF 对其执行追加操作。

示例如下:-

case class Customer(customerId: Int, customerName: String)

val x = sc.parallelize(Array(Customer(123, "User1"),Customer(456, "User2")))

val df = sqlContext.createDataFrame(x)

df.registerTempTable("df")

以上步骤将创建数据框并以 "df" 的名称注册。

现在注册Spark UDF(追加)

sqlContext.udf.register("append", (s: String, p1: String) => { if (s != null) s + p1 else p1 })

然后我将值赋给一个变量。此值需要附加 customerName 列值

val appendString = "'\""  

如果我尝试执行以下 spark 查询,我的追加字符串在值中同时包含单引号 (') 和双引号 (") :-

sqlContext.sql(s"SELECT  append(`customerName`, $appendString) as `customerName APPEND` from df").show

结果将是 Parse 异常

java.lang.RuntimeException: [1.68] failure: identifier expected SELECT append(customerName, '") as customerName APPEND from df ^ at scala.sys.package$.error(package.scala:27) at org.apache.spark.sql.catalyst.AbstractSparkSQLParser.parse(AbstractSparkSQLParser.scala:36)

我的预期输出是

customerName APPEND

用户 1'"

用户 2'"

我的发现如下:-

如果值中只有单引号,那么我可以成功执行如下查询:-

val appendString = "'" 

sqlContext.sql(s"""SELECT  append(`customerName`, \"$appendString\") as `customerName APPEND` from df""").show

如果值中只有双引号,那么我可以成功执行如下查询:-

val appendString = "\"" 

sqlContext.sql(s"""SELECT  append(`customerName`, '$appendString') as `customerName APPEND` from df""").show

但是如果同一个字符串中存在单引号 (') 和双引号 ("),我无法找到使用 Spark Data Frame Select 表达式 Select 执行此操作的可能方法 API.

我的spark版本是1.6.0

如有任何帮助,我们将不胜感激。

您可以使用 String Interpolation 从字符串中获取值。但是要让您的 UDF 首先工作,您需要将 appendString 值更改为

val appendString = """"'\"""""

它会将 "'\"" 值保存到 appendString 变量,您需要将其传递给您的 UDF。请注意,您需要跳过 " 并将 '\" 括在双引号中,以使其成为您的 UDF 的有效字符串字符。现在使用以下语句获取结果

sqlContext.sql(s"""SELECT  append(customerName, $appendString) as `customerName APPEND` from df""").show

//output
+-------------------+
|customerName APPEND|
+-------------------+
|            User1'"|
|            User2'"|
+-------------------+