Databricks中处理含$特殊字符的JSON字符串问题
处理Databricks中含$键的JSON解析问题
问题原因
你遇到的核心问题有两个:
- SQL中r前缀字符串的$解析问题:Spark SQL会将字符串中的
$识别为变量占位符(如${var}),即使你用Python的r前缀定义原始字符串,传递给Spark SQL后,$仍然会被解析,导致对应键值为空。 - from_json无法处理$键:本质是未正确定义包含特殊字符的Schema,默认情况下Spark会忽略不符合常规命名的字段,或者无法匹配。
解决方案
1. 正确传递含$的JSON字符串(避免SQL解析$)
不要在Spark SQL语句中直接写含$的JSON字面量,改用F.lit()传递原始字符串,绕开Spark SQL的变量解析:
from pyspark.sql import functions as F # 原始含$的JSON字符串 raw_json = r'{"$id": 456, "$status": "active"}' # 通过F.lit()将字符串传入DataFrame,避免SQL解析$ df = spark.createDataFrame([], "string").withColumn("json_col", F.lit(raw_json))
2. 使用from_json解析含$的JSON
方式一:Python中定义StructType Schema
直接在StructField的name参数中指定带$的字段名,Spark可以正确匹配:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType # 定义包含$字段的Schema schema = StructType([ StructField("$id", IntegerType(), nullable=True), StructField("$status", StringType(), nullable=True) ]) # 解析JSON df_parsed = df.withColumn("parsed_data", F.from_json(F.col("json_col"), schema)) # 查看解析结果 df_parsed.select("parsed_data.*").show()
方式二:SQL中使用DDL格式Schema
在DDL语句中用反引号`包裹带$的字段名,告诉Spark这是普通字段名:
-- 解析含$的JSON SELECT from_json(json_col, '`$id` int, `$status` string') AS parsed_data FROM your_table; -- 展开解析后的结构体 SELECT parsed_data.`$id`, parsed_data.`$status` FROM ( SELECT from_json(json_col, '`$id` int, `$status` string') AS parsed_data FROM your_table );
3. 替代方案:关闭Spark SQL的变量解析(可选)
如果需要在SQL语句中直接使用含$的字符串,可以修改Spark配置,关闭变量替换:
spark.conf.set("spark.sql.variable.substitute", "false")
修改后,Spark SQL不会解析字符串中的$,直接作为普通字符处理,但注意这会影响全局的变量替换功能,按需使用。
内容的提问来源于stack exchange,提问作者alhazen
相关产品推荐
相关产品推荐

