首页 文章

SPARK:数据框如果值中包含单引号和双引号,则选择表达式无法执行追加操作

提问于
浏览
0

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

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

Example given below :-

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]失败:标识符期望SELECT追加(customerName,'“)作为来自df ^的客户名APPEND,位于org.apache.spark的scala.sys.package $ .error(package.scala:27) .sql.catalyst.AbstractSparkSQLParser.parse(AbstractSparkSQLParser.scala:36)

我的预期输出是

customerName APPEND

用户1' ”

用户2' ”

My finding are given below :-

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

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表达式API执行此操作的方法 .

我的火花版是1.6.0

Any help would be greatly appreciated.

1 回答

  • 0

    您可以使用String Interpolation从String中获取值 . 但要使您的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'"|
    +-------------------+
    

相关问题