在hive和presto中复制外部表架构并将元数据从一个db分区到另一个db

在hive和presto中复制外部表架构并将元数据从一个db分区到另一个db,hive,presto,aws-glue,amazon-athena,Hive,Presto,Aws Glue,Amazon Athena,我想在Hive和Presto Athena中将外部表的模式及其所有分区信息从一个数据库复制到另一个数据库。明确地说,我不想复制任何底层数据,只想复制元数据 最好的方法是什么?在Athena中,您可以使用SHOW CREATE TABLE database1.tablename生成DDL,然后执行以下语句,将database1替换为database2。它将复制模式,但不会复制数据和分区。要填充分区,应在database2.tablename上执行。普雷斯托也是如此 如果无法使用MSCK修复表填充分

我想在Hive和Presto Athena中将外部表的模式及其所有分区信息从一个数据库复制到另一个数据库。明确地说,我不想复制任何底层数据,只想复制元数据


最好的方法是什么?

在Athena中,您可以使用SHOW CREATE TABLE database1.tablename生成DDL,然后执行以下语句,将database1替换为database2。它将复制模式,但不会复制数据和分区。要填充分区,应在database2.tablename上执行。普雷斯托也是如此

如果无法使用MSCK修复表填充分区,则可以使用Glue API进行复制:

import boto3
glue = boto3.client('glue')
paginator = glue.get_paginator('get_partitions')
DB_NAME_SRC = 'src'
DB_NAME_DST = 'dst'
TABLE = 'tablename'

partitions = []
for page in paginator.paginate(DatabaseName=DB_NAME, TableName=TABLE):
    for partition in page['Partitions']:
        del partition['DatabaseName']
        del partition['TableName']        
        del partition['CreationTime']        
        partitions.append(partition)
print("Got %d partitions" % len(partitions))
glue.batch_create_partition(DatabaseName=DB_NAME_DST, TableName=TABLE, PartitionInputList=partitions)
在PrestoSql中,您可以使用创建表。。。比如语法。看


你能确认你的EMR集群是否集成了AWS Glue吗?@Prabhakarredy不,它没有。在我的例子中,分区不是蜂巢可识别的格式…./field=value/。。。和分布在多个s3位置,即表位置与数据分区位置不同。因此,我无法重新创建,需要一种复制的方法。@GuSuku我已经编辑了答案,添加了python脚本来复制partitionsHanks。它也复制分区元数据吗?请参见我在@shuvalov的回答中的第一条评论
CREATE TABLE bigger_orders (
   LIKE orders INCLUDING PROPERTIES
)