AWS上的Hive:将S3 JSON转换为Columnar保留分区

时间:2017-03-13 01:29:15

标签: hadoop hive emr amazon-emr amazon-athena

我在S3中有包含许多JSON行的文件(由换行符分隔)。我想将这些文件转换为柱状格式以供AWS Athena

使用

我跟随Converting to Columnar Formats guide执行此操作,但是当转换为ORC时,S3中的分区约定将丢失。

在此示例中,如何在转换为镶木地板s3文件夹结构中保留dt分区?当我运行示例时,它只输出s3://myBucket/pq/000000_0而不是s3://myBucket/pq/dt=2009-04-14-04-05/000000_0

这是设置接口以将JSON引入Hive表的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;

以下是转换为Parquet的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 个答案:

答案 0 :(得分:3)

首先,将PARTITIONED BY (dt string)添加到parquet_hive定义。

第二 -
如果要按分区插入数据,则必须声明要插入的分区。 请注意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没有&#34;将JSON读入Hive表&#34; 它只是一个具有读取HDFS文件所需信息的界面 `

答案 1 :(得分:0)

您可以简单地包含第一个语句中的相同PARTITIONED BY (dt string)参数,该参数将创建相同的目录结构。

在这种情况下,dt字段(可能是日期)实际存储在目录名称中。为每个值创建一个单独的目录。