S3 JSON 構文解析
JSON 文書内の値は、制限なしでオブジェクトまたは配列内にネストすることができます。 S3 選択エンジンで JSON 文書内の特定の値を照会する場合、値の場所は SELECT ステートメントのパスを介して指定されます。
JSON 文書の汎用構造には、CSV や Parquet のような行と列の構造はありません。 代わりに、JSON 文書を照会するときに行と列を定義するのは、SQL ステートメント自体です。
S3 選択エンジンの JSON パーサーは、以下のように S3-objects を解析します。
SELECTステートメントのFROM節は、行境界を定義します。- JSON 文書の行は、行区切り文字を使用して CSV オブジェクトの行を定義する方法、および行グループを使用して Parquet オブジェクトの行を定義する方法に似ています。
- 次の例を考えてみましょう。
{ "firstName": 「ジョー "lastName": 「ジャクソン "gender": "Male", 「年齢」:「20歳」、 「住所」: { "streetAddress": 「101」 "都市":「サンディエゴ 州"カリフォルニア州" }, "firstName": "Joe_2", "lastName": "Jackson_2", "gender": "Male", 年齢21, 「住所」: { "streetAddress": 「101」 "都市":「サンディエゴ 州"カリフォルニア州" }, "phoneNumbers": [ { "type": "home1", "number": "734928_1","addr": 11 }, { "type": "home2", "number": "734928_2","addr": 22 } ], "key_after_array":"XXX"、 「description" : { "main_desc" : " value_1 "、 "second_desc" : " value_2 " } } # from句は1行を定義する。 # 1がルートオブジェクトのレベルを指す。 # _1.age はDocumnet-rowに2回表示され、最後の値が操作に使われる。 query = "select _1.firstname,_1.key_after_array,_1.age+4,_1.description.main_desc,_1. description.second_desc from s3object[* ];"; 期待される結果 Joe_2,XXX,25,value_1,value_2 # from句はphonenumbers配列を指す(_1を定義する) # phoneNumbers 配列の各要素は行を定義する。 # この場合、各要素は3つのキー/値を含むオブジェクトである。 # の場合、クエリがアクセスできるのは _1.phonenumbers パス上にある値のみです。 query = "select cast(substring( _1.number,1,6 ) as int) *10 from s3object[* ].phonenumbers where _1.type= ' home2 ';"; 期待される結果 = 7349280- このステートメントは、パス aa.bb.cc を検索するようにリーダーに指示し、このパスのオカレンスに基づいて行境界を定義します。
- 行は、リーダーがパスを検出すると開始し、リーダーがパスの最も内側の部分 (この場合はオブジェクト cc) を終了すると終了します。