在一个包含复杂类型的配置单元表上创建一个日期有限的视图,这个视图可以用impala查询吗?

cyvaqqii  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(363)

我有一个非常大的Parquet表,其中包含嵌套的复杂类型,如结构和数组。我已经按日期对它进行了分区,并希望将某些用户限制为,比如说,最近一周的数据。
通常的方法是在表的顶部创建一个有时间限制的视图,例如:
''create view time\u limited\u view as select*from my\u table where partition\u date>='2020-01-01''
在配置单元中查询视图时,这可以正常工作。但是,如果我尝试从impala查询此视图,则会得到一个错误:

analysisexception:选择列表中的expr“my\u table.struct\u column”返回复杂类型

原因是impala不允许在select列表中使用复杂类型。我构建的任何选择复杂列的视图都会导致如下错误。如果我扁平化/取消复杂类型,这当然可以解决这个问题。但是,由于涉及到嵌套层,我希望保持表结构的原样。
我看到另一个建议的解决方法是使用ranger行级过滤,但我没有ranger,因此无法在集群上安装它。任何关于hive/impala sql解决方案的建议都将不胜感激

ni65a41a

ni65a41a1#

在处理一个不同的问题时,我遇到了一种适合我需要的解决方案(但决不是一般的解决方案)。我想我会把它贴出来,以防有人有类似的需求。
我可以简单地使用外部表,而不是使用视图。因此,首先我将使用hive在数据库\u1中创建一个表,该表在hdfs中有一个对应的位置,location \u1。这是我用于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中的同一位置创建第二个外部表。但是,该表存储在一个具有更广泛用户组的数据库中( db2 )。

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';

因为这是一个外部表,所以我可以随意添加/删除日期分区,而不会影响底层数据。我可以向metastore添加1周的日期分区,据最终用户所知,表中提供的就这些。我甚至可以将此部分作为etl作业的一部分,每次添加新数据时,我都会将该分区添加到外部表中,然后从一周前删除一个分区,这样就可以将1周数据的滚动窗口提供给该用户组,而不必将一堆数据复制到单独的位置。
这绝不是一种行过滤解决方案,而是一种方便的方法,可以使用分区将数据子集公开给更广泛的用户组,而不必在单独的位置复制数据。

相关问题