AWS 上的 Hive:将 S3 JSON 转换为列式保留分区
Hive on AWS: convert S3 JSON to Columnar preserving partitions
我在 S3 中的文件包含许多行 JSON(以换行符分隔)。我想将这些文件转换为柱状格式供 AWS Athena
使用
我正在按照 Converting to Columnar Formats guide 执行此操作,但是当转换为 ORC 时,S3 中的分区约定丢失了。
在此示例中,如何在转换为 parquet s3 的文件夹结构中保留 dt
分区?当我 运行 这个例子时它只输出 s3://myBucket/pq/000000_0
而不是 s3://myBucket/pq/dt=2009-04-14-04-05/000000_0
这是设置接口的 HQL,将 JSON 带入 Hive table:
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';
您可以简单地包含与第一个语句中相同的 PARTITIONED BY (dt string)
参数,这将创建相同的目录结构。
在这种情况下,dt
字段(大概是日期)实际上存储在目录名称中。为每个值创建一个单独的目录。
首先,将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
没有 "reads the JSON into a Hive table".
它只是一个具有读取 HDFS 文件所需信息的接口。
`
我在 S3 中的文件包含许多行 JSON(以换行符分隔)。我想将这些文件转换为柱状格式供 AWS Athena
使用我正在按照 Converting to Columnar Formats guide 执行此操作,但是当转换为 ORC 时,S3 中的分区约定丢失了。
在此示例中,如何在转换为 parquet s3 的文件夹结构中保留 dt
分区?当我 运行 这个例子时它只输出 s3://myBucket/pq/000000_0
而不是 s3://myBucket/pq/dt=2009-04-14-04-05/000000_0
这是设置接口的 HQL,将 JSON 带入 Hive table:
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';
您可以简单地包含与第一个语句中相同的 PARTITIONED BY (dt string)
参数,这将创建相同的目录结构。
在这种情况下,dt
字段(大概是日期)实际上存储在目录名称中。为每个值创建一个单独的目录。
首先,将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
没有 "reads the JSON into a Hive table".
它只是一个具有读取 HDFS 文件所需信息的接口。
`