2017-03-13 8 views
1

S3に、改行で区切られたJSONの行が多数含まれているファイルがあります。これらのファイルを消費するColumnar形式に変換したいAWS Athena これを行うにはConverting to Columnar Formats guideに従っていますが、ORCに変換するとS3のパーティションの規則が失われます。AWSのHive:S3 JSONをColumnarの保存パーティションに変換する

この例では、dtパーティションを変換された寄木細工s3フォルダ構造に保存するにはどうすればよいですか?私は例を実行すると、それだけでs3://myBucket/pq/000000_0とここにいないs3://myBucket/pq/dt=2009-04-14-04-05/000000_0

はハイブテーブルにJSONをもたらすためにインターフェイスを設定HQLで出力します。

ここ
CREATE EXTERNAL TABLE impressions (
    requestBeginTime string, 
    adId string, 
    impressionId string, 
    referrer string, 
    userAgent string, 
    userCookie string, 
    ip string, 
    number string, 
    processId string, 
    browserCookie string, 
    requestEndTime string, 
    timers struct<modelLookup:string, requestTime:string>, 
    threadId string, 
    hostname string, 
    sessionId string) 
PARTITIONED BY (dt string) 
ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' 
with serdeproperties ('paths'='requestBeginTime, adId, impressionId, referrer, userAgent, userCookie, ip') 
LOCATION 's3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions' ; 
msck repair table impressions; 

は寄木細工に変換HQLである

CREATE EXTERNAL TABLE parquet_hive (
    requestBeginTime string, 
    adId string, 
    impressionId string, 
    referrer string, 
    userAgent string, 
    userCookie string, 
    ip string) 
STORED AS PARQUET 
LOCATION 's3://mybucket/pq/'; 

INSERT OVERWRITE TABLE parquet_hive SELECT requestbegintime,adid,impressionid,referrer,useragent,usercookie,ip FROM impressions where dt='2009-04-14-04-05'; 

答えて

2

まず、PARTITIONED BY (dt string)からparquet_hiveの定義を追加します。

第2 -
データをパーティションに分割して挿入する場合は、挿入するパーティションを宣言する必要があります。 注PARTITION (dt='2009-04-14-04-05')

INSERT OVERWRITE TABLE parquet_hive PARTITION (dt='2009-04-14-04-05') 
SELECT requestbegintime,adid,impressionid,referrer,useragent,usercookie,ip 
FROM impressions where dt='2009-04-14-04-05' 
; 

簡単な方法は、動的なパーティショニングを使用することであろう。
PARTITION (dt)dtは、SELECTの最後の列にあることに注意してください。

hive.exec.dynamic.partition.modeを設定する必要があります。

set hive.exec.dynamic.partition.mode=nonstrict; 

INSERT OVERWRITE TABLE parquet_hive PARTITION (dt) 
SELECT requestbegintime,adid,impressionid,referrer,useragent,usercookie,ip,dt 
FROM impressions where dt='2009-04-14-04-05' 
; 

P.S.
CREATE EXTERNAL TABLE impressionsは、「JSONをハイブテーブルに読み込みません」。
HDFSファイルを読み取るために必要な情報を持つインターフェイスです。

+0

本当に感謝しています。 Hive 2.1.1を実行しているAWS EMRでは、 'set hive.exec.dynamic.partition.mode = nonstrict;'が本当に必要です。 – rynop

0

同じPARTITIONED BY (dt string)パラメータを最初のステートメントに含めれば、同じディレクトリ構造が作成されます。

この場合、実際にはdtフィールド(おそらく日付)がディレクトリ名に格納されます。各値に対して個別のディレクトリが作成されます。

関連する問題