我有一个非常大的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解决方案的建议都将不胜感激
1条答案
按热度按时间ni65a41a1#
在处理一个不同的问题时,我遇到了一种适合我需要的解决方案(但决不是一般的解决方案)。我想我会把它贴出来,以防有人有类似的需求。
我可以简单地使用外部表,而不是使用视图。因此,首先我将使用hive在数据库\u1中创建一个表,该表在hdfs中有一个对应的位置,location \u1。这是我用于etl的“生产”数据库/表,其中包含大量数据。只有某些用户可以访问此数据库。
接下来,我在hdfs中的同一位置创建第二个外部表。但是,该表存储在一个具有更广泛用户组的数据库中( db2 )。
因为这是一个外部表,所以我可以随意添加/删除日期分区,而不会影响底层数据。我可以向metastore添加1周的日期分区,据最终用户所知,表中提供的就这些。我甚至可以将此部分作为etl作业的一部分,每次添加新数据时,我都会将该分区添加到外部表中,然后从一周前删除一个分区,这样就可以将1周数据的滚动窗口提供给该用户组,而不必将一堆数据复制到单独的位置。
这绝不是一种行过滤解决方案,而是一种方便的方法,可以使用分区将数据子集公开给更广泛的用户组,而不必在单独的位置复制数据。