1. ホーム
  2. sql

[解決済み] Presto の JSON_EXTRACT で ' ' 文字を含むキーに問題がある。

2022-02-04 12:21:24

質問

Presto(0.163)を使ってデータを照会しているのですが、jsonからフィールドを抽出しようとしています。

私は以下のようなjsonを持っており、それは列 'style_attributes'に存在しています。

"attributes": {
    "Brand Fit Name": "Regular Fit",
    "Fabric": "Cotton",
    "Fit": "Regular",
    "Neck or Collar": "Round Neck",
    "Occasion": "Casual",
    "Pattern": "Striped",
    "Sleeve Length": "Short Sleeves",
    "Tshirt Type": "T-shirt"
}

フィールド 'Short Sleeves' を抽出できません。 以下は、私が使用しているクエリです。

JSON_EXTRACT(style_attributes,'$.attributes.Sleeve Length') を length としてテーブルから選択します。

このクエリは次のエラーで失敗します。「無効なJSONパス: '$.attributes.Sleeve Length'

フィールドに「'」(スペース)がない場合、クエリーは正常に実行されます。

Prestoのドキュメントで解決策を探したのですが、うまくいきませんでした。

解決方法を教えてください。

presto:default> select json_extract_scalar('{"attributes":{"Sleeve Length": "Short Sleeves"}}','$.attributes["Sleeve Length"]');
     _col0
---------------
 Short Sleeves

または

presto:default> select json_extract_scalar('{"attributes":{"Sleeve Length": "Short Sleeves"}}','$["attributes"]["Sleeve Length"]');
     _col0
---------------
 Short Sleeves

JSON関数の変更点

は、:func: json_extract と :func: json_extract_scalar 関数が が角括弧構文に対応しました。

SELECT json_extract(json, '$.store[book]'); 
SELECT json_extract(json,'$.store["book name"]');

この変更に伴い、以下の文字が追加されました。 ブラケットを使用しないパスセグメントで許容されるのは 英数字、アンダースコア、コロン。また、コロンも使用できません。 は、引用符で囲まれていないブラケット付きパスセグメントで使用されます。新しいブラケット構文 を引用符で囲むと、特殊文字を含む要素にマッチします。

https://github.com/prestodb/presto/blob/c73359fe2173e01140b7d5f102b286e81c1ae4a8/presto-docs/src/main/sphinx/release/release-0.75.rst