1

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

我正在按照转换为列格式的指南来执行此操作,但是当转换为 ORC 时,S3 中的分区约定会丢失。

在此示例中,您如何保留dt已转换为 parquet s3 文件夹结构中的分区?当我运行示例时,它只是输出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';
4

2 回答 2

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'
;

Ps
CREATE EXTERNAL TABLE impressions不会“将 JSON 读入 Hive 表”。
它只是一个包含读取 HDFS 文件所需信息的接口。
`

于 2017-03-13T07:07:28.180 回答
0

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

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

于 2017-03-13T02:26:30.690 回答