使用 Impala 选择具有通配符模式的多个表并将它们连接起来

Posted

技术标签:

【中文标题】使用 Impala 选择具有通配符模式的多个表并将它们连接起来【英文标题】:Using Impala to select multiple tables with wildcard pattern and concatenate them 【发布时间】:2020-06-26 10:23:03 【问题描述】:

我从Impala SQLHadoop 开始,有一个(可能很简单)问题。

我有一个 Hadoop 数据库,其中包含数百个具有相同架构和命名约定的表(例如 process_1process_2process_3 和很快)。我将如何查询所有表并将它们连接到一个大表或数据框中?是否可以通过仅使用Impala SQL 来做到这一点,它在python 中返回一个数据帧?

类似:

SELECT * FROM 'process_*'; 

或者我需要运行SHOW TABLES 'process_*',在python中使用循环并分别查询每个表吗?

【问题讨论】:

【参考方案1】:

如果您正在寻找纯粹的 Impala 解决方案,那么一种方法是在所有表格的顶部创建一个视图。如下:

create view process_view_all_tables as
 select * from process1
 union all
 select * from process2
 union all
 ...
 select * from processN;

这种方法的缺点如下:

您需要将多个表联合在一起。就内存利用率而言,联合是一项昂贵的操作。如果您的表格数量较少(例如 2-5 个表格),则可以正常工作。 您需要手动添加所有表。如果您将来有一个新的进程表,则需要 ALTER 视图然后添加新表。这是一个令人头疼的维护问题。 视图假定所有 PROCESS 表都具有相同的架构。

第二种方法中,正如您所说,您可以使用SHOW TABLES LIKE 'process*' 从 Impala 查询表列表,然后编写一个小程序来遍历表列表并创建文件。 生成文件后,您可以将文件移植回 HDFS 并在其上创建一个表。

第二种方法的唯一缺点是每次迭代都会有 impala 数据库请求,这在多租户数据库环境中尤其不利。

在我看来,你应该尝试第二种方法。

希望这会有所帮助:)

【讨论】:

好的,我希望在 Impala 中找到类似于 Google 的 BigQuery 中的内容,您可以在 FROM 语句中使用通配符(另请参见此处:cloud.google.com/bigquery/docs/querying-wildcard-tables)。尽管如此,我还是尝试了第二种基于 python 的方法,它工作得很好。我想我只能忍受它:-)

以上是关于使用 Impala 选择具有通配符模式的多个表并将它们连接起来的主要内容,如果未能解决你的问题,请参考以下文章

使用 Impala 或 Hive 提取表列中的多个字符串元素

为分区数据定义 Impala 表模式

从带有子目录的 HDFS 目录创建 Impala 表

对具有相同模式名称的多个数据库使用 mysql 函数

SQL 从多个表中选择 *

SQL/Impala:将多个查询(具有不同的 where 子句)合并为一个