web-dev-qa-db-ja.com

JSONデータからHiveテーブルを作成するにはどうすればよいですか?

JSONデータ(ネスト)からHiveテーブルを作成し、クエリを実行したいのですが?これも可能ですか?

JSONファイルをS3にアップロードしてEMRインスタンスを起動することはできましたが、JSONファイルをHiveテーブルにするためにHiveコンソールに何を入力するのかわかりませんか?

誰かが私を始めるためのコマンドの例を持っていますか、Googleで役に立つものを見つけることができません...

33
nickponline

HiveがJSONをテーブルの列にマップするには、JSON serdeを使用する必要があります。

ここにある方法を示す本当に良い例:

http://aws.Amazon.com/articles/2855

残念ながら、提供されているJSON serdeはネストされたJSONをうまく処理できないため、使用するにはJSONをフラット化する必要があります。

この記事の正しい構文の例を次に示します。

create external table impressions (
    requestBeginTime string, requestEndTime string, hostname string
  )
  partitioned by (
    dt string
  )
  row format 
    serde 'com.Amazon.elasticmapreduce.JsonSerde'
    with serdeproperties ( 
      'paths'='requestBeginTime, requestEndTime, hostname'
    )
  location 's3://my.bucket/' ;
23
seedhead

実際には、JSON SerDeを使用する必要はありません。ここには素晴らしいブログ記事があります(私は著者とは一切関係ありません):

http://pkghosh.wordpress.com/2012/05/06/Hive-plays-well-with-json/

これは、組み込み関数json_Tupleを使用して、クエリ時にJSONを解析する戦略の概要を示しています(テーブル定義時ではありません):

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_Tuple

基本的に、テーブルスキーマは、各行を単一の「文字列」列としてロードし、クエリごとに必要に応じて関連するjsonフィールドを抽出するだけです。例えばそのブログ投稿からのこのクエリ:

SELECT b.blogID, c.email FROM comments a LATERAL VIEW json_Tuple(a.value, 'blogID', 'contact') b 
AS blogID, contact  LATERAL VIEW json_Tuple(b.contact, 'email', 'website') c 
AS email, website WHERE b.blogID='64FY4D0B28';

私の謙虚な経験では、これはより信頼性が高いことが証明されました(特にネストされたオブジェクトでJSONのserdesを扱うさまざまな暗号の問題に遭遇しました)。

31
Mike Repass

私は同じ問題を解決する必要がありましたが、JSON SerDesにまだリンクされているものはどれも十分に思えませんでした。 Amazonは良いかもしれませんが、どこからでもソースを見つけることができません(誰かがリンクを持っていますか?)。

JsonSerDeに組み込まれているHCatalogは、実際にはどこでもHCatalogを使用していないにもかかわらず、私のために機能しています。

https://github.com/Apache/hcatalog/blob/branch-0.5/core/src/main/Java/org/Apache/hcatalog/data/JsonSerDe.Java

HCatalogのJsonSerDeを使用するには、hcatalog-core .jarをHiveのauxpathに追加し、Hiveテーブルを作成します。

$ Hive --auxpath /path/to/hcatalog-core.jar

Hive (default)>
create table my_table(...)
ROW FORMAT SERDE
  'org.Apache.hcatalog.data.JsonSerDe'
...
;

ここに詳細を記載した投稿を書きました

http://ottomata.org/tech/too-many-Hive-json-serdes/

3
otto

Hcatalog-coreのHive 0.12以降には、JSONデータをシリアル化および逆シリアル化するJsonSerDeがあります。そのため、次の例のような外部テーブルを作成するだけです。

CREATE EXTERNAL TABLE json_table (
    username string,
    Tweet string,
    timestamp long)
ROW FORMAT SERDE
'org.Apache.Hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION
 'hdfs://data/some-folder-in-hdfs'

対応するJSONデータファイルは、次の例のようになります。

{"username":"miguno","Tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","Tweet":"Works as intended.  Terran is IMBA.","timestamp": 1366154481 }
2
Heapify

.jsonファイルからSerDeスキーマを生成する

.jsonファイルが大きい場合、スキーマを手作業で記述するのは退屈かもしれません。その場合、この便利なツールを使用して自動的に生成できます。

https://github.com/strelec/Hive-serde-schema-gen

1
Rok Kralj

JSON処理機能は、Hiveですぐに使用できるようになりました。

Hive 4.0.0以降

CREATE TABLE ... STORED AS JSONFILE

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormatsStorageFormatsRowFormat,StorageFormat,andSerDe

各JSONオブジェクトは、1行に収まるようにフラット化する必要があります(改行文字はサポートしていません)。これらのオブジェクトは、正式なJSON配列の一部ではありません。

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}
0
davidemm