以可使用 Impala 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?

Posted

技术标签:

【中文标题】以可使用 Impala 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?【英文标题】:Create a date-limited view on a hive table containing complex types in a way that is queryable with Impala? 【发布时间】:2020-01-13 12:15:46 【问题描述】:

我有一个非常大的 parquet 表,其中包含嵌套的复杂类型,例如结构和数组。我已按日期对其进行了分区,并希望将某些用户限制为最近一周的数据。

通常的做法是在表格顶部创建一个有时间限制的视图,例如:

''' 创建视图 time_limited_view AS SELECT * FROM my_table WHERE partition_date >= '2020-01-01' '''

这在 Hive 中查询视图时可以正常工作。但是,如果我尝试从 Impala 查询此视图,则会收到错误消息:

** AnalysisException: Expr 'my_table.struct_column' in select list 返回复杂类型 **

原因是 Impala 不允许选择列表中的复杂类型。我构建的任何选择复杂列的视图都会导致这样的错误。如果我扁平化/取消嵌套复杂类型,这当然可以解决这个问题。但是由于涉及嵌套层,我希望保持表结构不变。

我看到另一个建议的解决方法是使用 Ranger 行级过滤,但我没有 Ranger 并且无法在集群上安装它。任何有关 Hive/Impala SQL 变通办法的建议将不胜感激

【问题讨论】:

【参考方案1】:

在处理不同的问题时,我遇到了一种适合我需要的解决方案(但绝不是通用解决方案)。我想我会发布它以防万一有人有类似需求。

我可以简单地使用外部表,而不是使用视图。因此,首先我将使用 Hive 在 database_1 中创建一个表,该表在 hdfs 中具有相应的位置 location_1。这是我用于 ETL 的“生产”数据库/表,包含大量数据。只有特定用户可以访问此数据库。

CREATE TABLE database_1.tablename
(`col_1` BIGINT,
`col_2` array<STRUCT<X:INT, Y:STRING>>)
PARTITIONED BY (`date_col` STRING)
STORED AS PARQUET
LOCATION 'location_1';

接下来,我在 hdfs 中的同一位置 中创建第二个 外部 表。但是,此表存储在具有更广泛用户组 (database_2) 的数据库中。

CREATE EXTERNAL TABLE database_2.tablename
(`col_1` BIGINT,
`col_2` array<STRUCT<X:INT, Y:STRING>>)
PARTITIONED BY (`date_col` STRING)
STORED AS PARQUET
LOCATION 'location_1';

由于这是一个外部表,我可以随意添加/删除日期分区,而不会影响底层数据。我可以将 1 周的日期分区添加到元存储中,据最终用户所知,这就是表中可用的全部内容。我什至可以将这部分作为我的 ETL 工作,每次添加新数据时,我都会将该分区添加到外部表中,然后从一周前删除一个分区,从而使 1 周数据的滚动窗口可用到此用户组,而无需将数据负载复制到单独的位置。

这绝不是行过滤解决方案,而是使用分区将数据子集公开给更广泛的用户组的便捷方式,而无需在单独的位置复制该数据。

【讨论】:

以上是关于以可使用 Impala 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 impala 或 hive 上读取复杂类型数组<string>?

如何在 Impala 中显示复杂数据列(地图类型)中的所有字段?

Impala并发查询缓慢问题解决方案

Apache Impala(五) Impala数据导入方式

如何以干净且可维护的方式编写非常复杂的 SQL? [关闭]

基于 Web 应用程序中的事务数据以可扩展的方式计算结果?