【问题标题】:Copying an external table schema and partitions metadata from one db to another in hive and presto在 hive 和 presto 中将外部表模式和分区元数据从一个数据库复制到另一个数据库
【发布时间】:2020-03-27 17:22:24
【问题描述】:

我想将 external 表的架构及其所有分区信息从一个数据库复制到 Hive 和 Presto (AWS Athena) 中的另一个数据库。需要明确的是,我不想复制任何基础数据 - 只是元数据。

最好的方法是什么?

【问题讨论】:

  • 您能否确认您的 EMR 集群是否集成了 AWS Glue?
  • @PrabhakarReddy 不,它没有。

标签: hive presto aws-glue amazon-athena


【解决方案1】:

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

如果您无法使用MSCK REPAIR TABLE 填充分区,您可以使用 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)

【讨论】:

  • 在我的情况下,分区不是 hive 可识别格式 (../field=value/...) 并且分布在多个 s3 位置,即。表位置与数据分区位置不同。因此,我无法重新创建并需要一种复制方式。
  • @GuSuku 我已经编辑了答案,添加了 python 脚本来复制分区
【解决方案2】:

在 PrestoSql 中,您可以使用 CREATE TABLE ... LIKE 语法。见https://prestosql.io/docs/current/sql/create-table.html

CREATE TABLE bigger_orders (
   LIKE orders INCLUDING PROPERTIES
)

【讨论】:

  • 谢谢。它是否也复制分区元数据? (请参阅我在@shuvalov 的回答中的第一条评论)
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多