4

JSONオブジェクトを含むテーブルがあります。各JSONオブジェクトには、コンマで区切られた角かっこで囲まれた配列が含まれています。

SQLを使用して、角括弧配​​列の要素(「マット」など)にアクセスするにはどうすればよいですか?

{"str":
   [
     1,
     134,
     61,
     "Matt",
     {"action.type":"registered","application":491,"value":423,"value2":12344},
     ["application"],
     [],
     "49:0"
   ]
}

Hadoopの上で「Hive」を使用しています。SQLでこれを行う方法を知っている場合は、それで問題ありません:)

4

2 に答える 2

6

これは、Hiveで次のように実行できます。

まず、JSON SerDe(Serializer / Deserializer)が必要です。私が見た中で最も機能的なものはhttps://github.com/rcongiu/Hive-JSON-Serde/です。Peter SankauskasのSerDeは、この複雑なJSONを処理できないようです。この記事の執筆時点では、Mavenを使用してSerDeをコンパイルし、Hiveセッションが到達できる場所にJARを配置する必要があります。

次に、JSON形式を変更する必要があります。その理由は、Hiveは厳密に型指定された配列のビューを使用するため、整数などを混在させることはできません。次のような構造体に切り替えることを検討してください。

{"str": { 
   n1 : 1,
   n2 : 134,
   n3 : 61,
   s1: "Matt",
   st1: {"type":"registered","app":491,"value":423,"value2":12344},
   ar1: ["application"],
   ar2: [],
   s2: "49:0"
} }

次に、JSONをすべて1行に配置する必要があります。これがHiveとSerDeのどちらの癖なのかはわかりませんが、実行する必要があります。

次に、データをHDFSにコピーします。

これで、テーブルを定義してクエリを実行する準備が整いました。

ADD JAR /path/to/jar/json-serde-1.1.2-jar-with-dependencies.jar;
CREATE EXTERNAL TABLE json (
    str struct<
       n1 : int, n2 : int, n3 : int,
       s1 : string,
       st1 : struct < type : string, app : int, value : int, value2 : int>,
       ar1 : array<string>,
       ar2 : array<string>,
       s2 : string
    >
 )
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
 LOCATION '/hdfs/path/to/file';

これを適切に配置すると、次のような興味深いネストされたクエリを実行できます。

select str.st1.type from json;

最後になりましたが、これはHiveに固有のものであるため、質問とタグを更新する価値があります。

于 2012-07-29T09:05:59.680 に答える
0

データベースエンジンに非常に固有の何かを使用し、使用しているデータベースエンジンを指定していない限り、それはできません。

「できない」理由は、SQL/RDBMSがそのタイプのストレージ用に設計されていないためです。必要に応じて、適切な正規化またはNoSQLソリューションのいずれかを使用することをお勧めします。

于 2012-07-25T23:11:21.993 に答える