如何在AWS中创建两个胶水表的单一视图?



我有一个场景,其中我有两个表- Table1和Table2被创建使用爬虫与源作为parquet在我的s3前缀-s3://bucket_name/my_tables/Table1/data.parquets3://bucket_name/my_tables/表/data.parquet。

这些表有以下列-Table1- id、类型、名称、地址- id,类型,办公室编号,指定

考虑这里所有列的类型为字符串。

在athena -现在我想创建一个表名为-MyTables将上面两个表中的所有列组合起来。基本上,我运行了一个查询来手动创建这个表,并指定源为-s3://bucket_name/my_tables

表被创建,但它是空的。如何在不复制S3中的记录和使用用于创建表1和表2的相同文件的情况下实现这一点?之后,它只是一个表,所有的列都出现在这两个表中。

我能够单独加载分区。首先,我运行一个SQL查询,在Athena中创建一个表。然后我使用ALTER partitions添加分区查询所有的date分区。

是否有一种方法来加载数据使用单个查询?另外,如果添加了新的日期分区,那么我是否必须再次手动添加这些分区?

如果我理解正确的话,你有这两个表:

Table1
======
id | type | name | address
---+------+------+--------
i1 | t1   | n1   | a1
i2 | t2   | n2   | a2

Table2
======
id | type | officenumber | designation
---+------+--------------+------------
i3 | t3   | o3           | d3
i4 | t4   | o4           | d4

而你想要得到

id | type | name | address | officenumber | designation
---+------+------+---------+--------------+------------
i1 | t1   | n1   | a1      | NULL         | NULL
i2 | t2   | n2   | a2      | NULL         | NULL
i3 | t3   | NULL | NULL    | o3           | d3
i4 | t4   | NULL | NULL    | o4           | d4

。这不是一个连接,而是一种行和模式的联合。

更通用的解决方案是创建一个带有联合查询的视图:
CREATE OR REPLACE VIEW union_view AS
SELECT id, type, name, NULL AS officenumber, NULL AS designation FROM Table1
UNION ALL
SELECT id, type, NULL AS name, NULL AS address, officenumber, designation FROM Table2

另一种方法是创建一个新表,其中LOCATION指向两个表的LOCATIONs的共享父表(假设该前缀下没有其他数据)。这将起作用,因为雅典娜通过名称将表列映射到Parquet文件中的列,如果文件缺少列,雅典娜将用NULL填充(这并非适用于所有数据格式,但适用于Parquet和JSON):

CREATE EXTERNAL TABLE union_table (
id STRING,
type STRING,
name STRING,
address STRING,
officenumber STRING,
designation STRING
)
STORED AS PARQUET
LOCATION 's3://bucket_name/my_tables/'

这听起来像是当你有一个空表时你试图做的事情。发生这种情况的原因可能是因为您创建了一个分区表,而没有添加分区。

要问自己的一件事是:您需要一个分区表吗?如果没有,就使用上面的SQL。

如果您需要分区,我建议使用分区投影,而不是依赖爬虫。爬虫可以在开发过程中发现模式,但是与Partition Projection相比,它们速度慢且成本高,并且在生产中使用有些危险。有一个命令经常出现在文档中:MSCK REPAIR TABLE,但这对你不起作用,因为你的数据没有使用Hive风格的分区命名(但没有很大的损失,这是一种低效的管理分区的方式,如果你需要一个分区表,你应该真正使用分区投影)。

相关内容

  • 没有找到相关文章

最新更新