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

Create a date-limited view on a hive table containing complex types in a way that is queryable with Impala?

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

通常的做法是在 table 之上创建一个限时视图,例如:

''' 创建视图 time_limited_view 作为 SELECT * 从 my_table WHERE partition_date >= '2020-01-01' '''

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

** AnalysisException: Expr 'my_table.struct_column' in select list returns a complex type **

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

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

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

我可以简单地使用外部 table 而不是使用视图。所以首先我会使用 Hive 在 database_1 中创建一个 table,它在 hdfs 中有一个相应的位置 location_1。这是我用于 ETL 并包含大量数据的“产品”database/table。只有某些用户可以访问此数据库。

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 中的 相同位置创建第二个 external table。但是,此 table 存储在具有更广泛用户组 (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';

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

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