我有一个场景,其中我有两个表- 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
指向两个表的LOCATION
s的共享父表(假设该前缀下没有其他数据)。这将起作用,因为雅典娜通过名称将表列映射到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风格的分区命名(但没有很大的损失,这是一种低效的管理分区的方式,如果你需要一个分区表,你应该真正使用分区投影)。