web-dev-qa-db-ja.com

''文字を含むキーのPrestoでのJSON_EXTRACTの問題

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"
}

フィールド「ShortSleeves」を抽出できません。以下は私が使用しているクエリです:

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

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

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

Prestoのドキュメントで解決策を見つけようとしましたが、成功しませんでした。

5
Aaquib Khwaja
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

これがあなたの正解です。言ってみましょう:


JSON:{"旅行日": "2017-9-22"、 "市": "シアトル"}
列名:ITINERARYそして、現在のJSONから「TravelDate」を抽出します。

クエリ:SELECT JSON_EXTRACT(ITINERARY、 "$。\" Travel Date\"")from Table

注:キー名の最初と最後に\ "を追加するだけです。

これがあなたの必要に応じて確実に機能することを願っています。 :)

0
Arpan Jain
SELECT 
   tags -- It is column with Json string data
  ,json_extract(tags , '$.Brand') AS Brand
  ,json_extract(tags , '$.Portfolio') AS Portfolio
  ,cost
FROM
    TableName

Sample data for tags - {"Name": "pxyblob",  "Owner": "",  "Env": "prod",  "Service": "",  "Product": "",  "Portfolio": "OPSXYZ",  "Brand": "Limo",  "AssetProtectionLevel": "",  "ComponentInfo": ""}
0
Rajiv Singh