2017-09-21 4 views
0

私は会議への人の出席のため、以下のJSONオブジェクトがあります。私はS3アマゾンアテナ - ネストされたJSONを発行

に格納されたデータを持っているところを指してテーブルを作成するために、次のコードを実行した

{"conferences_attended": [ 
      {"conference_name": "dreamforce", 
      "date": "2017", 
      "city": "san francisco", 
      "state": "ca"}, 
      {"conference_name": "RampUp", 
      "date": "2016", 
      "city": "san francisco", 
      "state": "ca"}, 
      ], 
    "last_name" : "doe"} 

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
     `last_name` string, 
     `conferences_attended` array< struct< 
      conference_name:string, 
      date:string, 
      city:string, 
      state:string, 
     >>, 
    ) 
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
    WITH SERDEPROPERTIES (
     'serialization.format' = '1' 
    ) LOCATION 's3://**' 
    TBLPROPERTIES ('has_encrypted_data'='false'); 

今、私は私の質問に2つの部分を持っています。

1)ネストされたjsonオブジェクトにあるデータにアクセスするためにクエリを実行するにはどうすればよいですか?以下の2つのクエリは機能しませんし、類似していないクエリもあります。

2)ネストされたjsonの特定の部分だけに一致する結果を取得するにはどうしたらクエリできますか?

SELECT * 
    FROM attendees 
    WHERE conferences_attended.conference_name like '%force%'; 

私は...私はデータ型または非巣データか何かsimilrを変更する必要が助けとアクションのこれらのタイプをサポートする情報へのリンクをありがとうと信じて私をリードエラーを取得しています。注:私は以下のリンクを読んで、役に立つと思っていますが、まだ私のニーズを解決していません。 http://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.htmlhttp://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.htmlや他の多くの...

は最後に、「org.apache.hive.hcatalog.data.JsonSerDe」と「org.openx.data.jsonserde.JsonSerDe」の間の差異について何かアドバイスやリソースが歓迎されています。

答えて

0

まず、外部テーブルのフィールドが、それをポイントしようとしているjsonファイルのフィールドと一致しません。

それはそうと、以下のように、あなたのテーブル定義は次のようになります。

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
    `last_name` string, 
    `conferences_attended` array<struct<conference_name:string, 
    date:string, city:string, state:string>>, 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1' 
) LOCATION 's3://**' 
TBLPROPERTIES ('has_encrypted_data'='false'); 

あなたが他のフィールドにアクセスしようとしている間、あなたはconferences_attendedのフィールドとしてCOMPANY_NAMEとlinkedin_company_idを言及しています。この後

は、次のようにフィールドをアクセスすることができます。

SELECT conferences_attended 
FROM attendees; 

しかし、conferences_attendedは、構造体の配列であることから、あなたは、配列の特定の構造体のフィールドにアクセスするための配列のインデックスを言及する必要があります。あなたがデータにいくつかのフィルタをアレイ内のすべての構造を解析し、適用したい場合は、UNNESTを使用してそれを行うことが、今

SELECT conferences_attended[1].conference_name FROM attendees; 

:だから、これに代えて:

SELECT conferences_attended.conference_name 
FROM attendees; 

はこのような何かを試してみてください次のように機能:

SELECT 
last_name, 
conferences.conference_name, 
conferences.date, 
conferences.city, 
conferences.state 
FROM 
attendees CROSS JOIN UNNEST(conferences_attended) as t(conferences) 
WHERE 
conferences.conference_name like '%force%'; 

あなたはさらに参照のために、以下のリンクを参照してください可能性があります http://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html