在查询中使用通配符在 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 查询转换为 spark/scala 查询
在脚本中迭代/循环 Spark parquet 文件会导致内存错误/堆积(使用 Spark SQL 查询)