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'"|
+-------------------+
我的场景解释如下:-(下面的实验尝试使用 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
, '") ascustomerName 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'"|
+-------------------+