我的用例是我有两个数据源:1。震源1(作为速度层)2。s3顶部的配置单元外部表(作为批处理层)
我使用presto通过view从两个数据源查询数据。我想创建一个视图来合并来自这两个源的数据,比如:“create view test as selectfrom source1.table union all selectfrom hive.table”
我们在source1中保留了24小时的数据,24小时后数据将通过hive迁移到s3。
source1表的列are:timestamp,日志类型,公司,类别
用户将使用时间戳范围查询数据(可以查询过去15/30分钟、过去x小时、过去x天、过去x个月等的数据)例如:“selectfrom test where timestamp>(now()-interval'15'minute)”,“selectfrom test where timestamp>(now()-interval'12'hour)”,“select*from test where timestamp>(now()-interval'1'day)”
为了满足用户查询,我需要对配置单元表进行分区,并且用户不应该知道底层的策略,即如果用户查询的是最近x分钟的数据,那么如果presto正在从source1或配置单元读取数据,他/她就不必担心。
我的配置单元分区策略和视图策略应该是什么,以便查询能够在10秒内高效地运行并返回结果?
1条答案
按热度按时间xlpyo6sf1#
对于配置单元,应使用将在筛选器中查询的分区列。
在您的情况下,这是时间戳。但是,如果使用timestamp,它会根据列中的数据为每秒钟(或毫秒)创建一个分区。
更好的解决方案是创建如下列
year
,month
,day
,hour
(来自timestamp)并将其用作分区列。同样的策略也适用于kudu,但是请注意,它可能会创建热点,因为所有新到达的记录都将转到相同的(最近的)分区,这将限制插入(可能是查询)性能。
为了克服这个问题,可以使用一个额外的列作为哈希分区以及时间戳派生的列。
例如
year
,month
,day
,hour
,logtype