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



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

执行此操作的常用方法是在表顶部创建一个限时视图,例如:

''' 创建视图time_limited_view 作为选择 * 从my_table 其中partition_date>= '2020-01-01' '''

在 Hive 中查询视图时,这将正常工作。但是,如果我尝试从 Impala 查询此视图,则会出现错误:

分析异常:选择列表中的 expr 'my_table.struct_column' 返回复杂类型 **

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

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

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

我可以简单地使用外部表,而不是使用视图。因此,首先,我将使用 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 周数据的滚动窗口提供给该用户组,而无需将数据加载复制到单独的位置。

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

最新更新