我在s3中存储了数千个单独的json文件(对应于一个Table行),其中包含以下路径:s3://my-bucket/<date>/dataXX.json
当我在DDL中创建表时,是否可以在S3路径中将数据分区? (或者至少在新列中添加值)
由于
答案 0 :(得分:7)
可悲的是,雅典娜不支持这一点。对于使用文件夹进行分区,需要指定文件夹的名称。
e.g。 S3://我的桶/ {COLUMNNAME} = {} columnvalue /data.json
在您的情况下,如果您手动将这些分区添加到表中,您仍然可以使用分区。
e.g。 ALTER TABLE tablename ADD PARTITION(datecolumn ='2017-01-01')location's3:// my-bucket / 2017-01-01 /
AWS文档在该主题上有一些很好的例子。
答案 1 :(得分:2)
现在可以使用 storage.location.template 来做到这一点。这将按路径的某些部分进行分区。确保不要在列列表中包含新列,因为它将自动添加。您可以搜索很多选项来为您的日期示例进行调整。我用“id”来显示我能想到的最简单的版本。
CREATE EXTERNAL TABLE `some_table`(
`col1` bigint,
PARTITIONED BY (
`id` string
)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://path/bucket/'
TBLPROPERTIES (
'has_encrypted_data'='false',
'projection.enabled'='true',
'projection.id.type' = 'injected',
'storage.location.template'='s3://path/bucket/${id}/'
)
官方文档:https://docs.amazonaws.cn/en_us/athena/latest/ug/partition-projection-dynamic-id-partitioning.html
答案 2 :(得分:0)
不需要手动执行此操作。如果路径中的所有文件夹具有相同的结构,并且所有数据具有相同的架构设计,则设置一个粘着性爬虫,它将以文件夹的形式将文件夹(位于前缀中)作为分区。
将其命名为partition0。您可以进入edit-schema并将此分区的名称更改为date或任何您喜欢的名称。
但是请确保您进入了粘合爬虫,并在“配置选项”下选择了选项-“仅添加新列”。否则,在下一次运行粘合程序时,它将分区名称重设为partition0。
答案 3 :(得分:0)