我正在使用配置单元(使用外部表)来处理存储在amazon S3上的数据。
我的数据分区如下:
DIR s3://test.com/2014-03-01/
DIR s3://test.com/2014-03-02/
DIR s3://test.com/2014-03-03/
DIR s3://test.com/2014-03-04/
DIR s3://test.com/2014-03-05/
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log
如何使用配置单元创建分区表?
CREATE EXTERNAL TABLE test (
foo string,
time string,
bar string
) PARTITIONED BY (? string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';
有人可以回答这个问题吗?谢谢!
答案 0 :(得分:36)
首先从正确的表定义开始。在你的情况下,我只会使用你写的:
CREATE EXTERNAL TABLE test (
foo string,
time string,
bar string
) PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';
默认情况下,Hive希望分区位于通过约定s3://test.com/partitionkey=partitionvalue命名的子目录中。例如
s3://test.com/dt=2014-03-05
如果您遵循此约定,则可以使用MSCK添加所有分区。
如果您不能或不想使用此命名约定,则需要添加所有分区,如下所示:
ALTER TABLE test
ADD PARTITION (dt='2014-03-05')
location 's3://test.com/2014-03-05'
答案 1 :(得分:3)
如果要使用日期字段进行分区,则需要s3文件夹结构,如下所述:
s3://test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
在这种情况下,您可以创建带有分区列的外部表作为日期
并运行MSCK REPAIR TABLE EXTERNAL_TABLE_NAME
来更新hive元商店。
答案 2 :(得分:2)
请查看Carter Shanklin上面发布的回复。您需要确保您的文件作为partitionkey = partitionvalue存储在目录结构中,即Hive默认情况下希望分区位于通过约定命名的子目录中。
在您的示例中,它应存储为
S3://test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log
要遵循的步骤:
i)确保数据存在于上述结构中 ii)创建外部表 iii)现在运行msck修复表。
答案 3 :(得分:1)
我认为数据存在于s3位置,并且可能未在元数据中更新(emrfs)。为了使这首先工作,请执行emrfs导入和emrfs同步。 然后应用msck修复。
它将添加s3
中存在的所有分区答案 4 :(得分:0)
如果您的现有目录结构不符合<partition name>=<partition value>
,则必须手动添加分区。除非您像这样构建目录,否则MSCK REPAIR TABLE将无效。
在表创建时指定位置,如:
CREATE EXTERNAL TABLE test ( foo string, time string, bar string ) PARTITIONED BY (dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 's3://test.com/';
您可以在不指定完整路径的情况下添加分区:
ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05';
虽然我从未检查过,但我建议您将分区移动到存储桶内的文件夹中,而不是直接放在存储桶中。例如。从s3://test.com/
到s3://test.com/data/
。