【问题标题】:Databricks - Handling json string with keys containing special characters?Databricks - 使用包含特殊字符的键处理 json 字符串?
【发布时间】:2022-11-12 06:09:51
【问题描述】:

我有一个 JSON 字符串,其中包含具有 $ 的键。

在 databricks 笔记本中,使用前缀为 rselect 来表示原始文字:

SELECT
  r'{
         "key1": "value1",
          "$version": 74501,
          "$metadata": {
              "$modified": "2022-08-10T15:32:36.2808234Z"
          }
      }' AS jsonStr

返回无效的 str:

{
    "key1": "value1",
    "": 74501,
    "": {
        "": "2022-08-10T15:32:36.2808234Z"
    }
}

而用 \ 转义特殊字符,并删除 r

SELECT
  '{
         "key1": "value1",
          "\$version": 74501,
          "\$metadata": {
              "\$modified": "2022-08-10T15:32:36.2808234Z"
          }
      }' AS jsonStr

返回正确的字符串:

{
    "key1": "value1",
    "$version": 74501,
    "$metadata": {
        "$modified": "2022-08-10T15:32:36.2808234Z"
    }
}

我以为r 用 \ 代替了转义特殊字符的需要? 我宁愿不必在源数据上用 \$ 替换 $,因为这很昂贵。

无论如何,我正在尝试将键提取到结构中:

SELECT
  jsonStr,
  jsonStr:key1 AS value1,
  struct(
    get_json_object(jsonStr, '$.key1') AS key1,
    get_json_object(jsonStr, '$.\$version') AS version,
    get_json_object(jsonStr, '$.\$metadata.\$modified') AS modified
  ) AS extracted
FROM
  (
    -- Using manually escaped json str for now
    SELECT
      '{ "key1" :"value1",
      "\$version" :74501,
      "\$metadata": { "\$modified" :"2022-08-10T15:32:36.2808234Z" } }' AS jsonStr
  )

这行得通。然而,它是不是高效的。

我相信from_json 是首选,但确实不是使用“$”:

from_json(jsonStr, 'key1 STRING, \$version INTEGER')

感谢处理 $ 的任何帮助。

【问题讨论】:

    标签: escaping azure-databricks databricks-sql


    【解决方案1】:

    我认为这是一个错误。 r 或 no R 我看不出有什么区别。 $ 也会在其他地方中断,比如设置变量。

    值得测试这是否仅适用于在代码中输入的文字,或者从文件中读取的数据是否受到影响。

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多