You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:22