在查询中使用通配符在 Spark.SQL() 中转义字符

Posted

技术标签:

【中文标题】在查询中使用通配符在 Spark.SQL() 中转义字符【英文标题】:Escaping Characters in Spark.SQL() with Wildcard Inside of Query 【发布时间】:2021-09-22 21:58:25 【问题描述】:

示例查询:

df = spark.sql("""
select distinct key,
      coalesce(get_json_object(col2,'$.value'), case when col2 like '%value\\u0022: false%' then 'false' when col2 like '%value\\u0022: true%' then 'true' end) as col2flag
from Table
""")

在 Impala 中存在一个有效载荷结构,其中 \u0022 用于所需的值。在 Impala SQL 中转义这个 unicode 字符是通过一个额外的 \ 斜线来完成的。

当通过 Pyspark 提取此 DF 时,从 case 语句提取的值在预期为 true 时为 null。我已经用一个正斜杠和两个斜杠尝试了上述查询。

【问题讨论】:

看起来这是一个错误issues.apache.org/jira/browse/SPARK-17647 【参考方案1】:

尝试将spark.sql.parser.escapedStringLiterals 设置为'true',然后使用四个斜杠来解析字符串中的文字\。在此处查看此示例:

spark.sql("select * from df1").show(truncate=False)

+---+---------------------+
|id |str                  |
+---+---------------------+
|1  |value\x2 : true      |
|2  |test value\u2 : false|
|3  |val: true            |
+---+---------------------+

spark.conf.set("spark.sql.parser.escapedStringLiterals", "true")

spark.sql(" select * from df1 where str like '%value\\\\u%'  ").show(truncate=False)

+---+---------------------+
|id |str                  |
+---+---------------------+
|2  |test value\u2 : false|
+---+---------------------+

【讨论】:

以上是关于在查询中使用通配符在 Spark.SQL() 中转义字符的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL CTE在查询中忽略命名空间

sql 在 spark sql 数据帧查询中使用分区

将 spark.sql 查询转换为 spark/scala 查询

在脚本中迭代/循环 Spark parquet 文件会导致内存错误/堆积(使用 Spark SQL 查询)

使用 spark sql 在 sqlserver 上执行查询

spark sql - 如何在 spark sql 中编写动态查询