我在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';
答案 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
字段(可能是日期)实际存储在目录名称中。为每个值创建一个单独的目录。