【发布时间】:2022-11-12 06:09:51
【问题描述】:
我有一个 JSON 字符串,其中包含具有 $ 的键。
在 databricks 笔记本中,使用前缀为 r 的 select 来表示原始文字:
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