kylin客户端(python编写)不能按照预期的segment进行rebuild

kylin_client_tool 提供了对cube进行BUILD,REBUILD,MERGE功能,其中REBUILD却不能达到预期的效果按照指定的segment执行。

场景:

当我在kylin web页面对cube进行两次构建(分别是2000-01-01——2017-12-01, 2017-12-01——2017-12-02),我要对第二个段进行重构,执行python kylin_client_tool.py -P project_name -M REBUILD -C cube_name -T 2017-12-01 -E 2017-12-02,并没有按照预想的结果只对segment:2017-12-01——2017-12-02重构,反而对段2000-01-01——2017-12-01, 2017-12-01——2017-12-02都进行了重构,这里源代码有个bug,稍微做下修改即可。

解决方案:

需要修改的源代码:kylin_client_tool/scheduler/workers/cube.py   第115行determine_segment_range方法

114     @staticmethod
115     def determine_segment_range(segments, dt_start, dt_end):
116         pointer_dt_start = (int(time.mktime(parser.parse(dt_start).timetuple())) - time.timezone) * 1000
117         pointer_dt_end = (int(time.mktime(parser.parse(dt_end).timetuple())) - time.timezone) * 1000
118  
119         if(pointer_dt_start > pointer_dt_end):
120             raise Exception("Start date (%s) is older than end date (%s)!" % (str(pointer_dt_start), str(pointer_dt_end)))
121  
122         segments_to_refresh = []
123         for segment in segments:
124             if((pointer_dt_start <= segment.date_range_start and segment.date_range_end <= pointer_dt_end) or       # |..|       
125                 (segment.date_range_start <= pointer_dt_start and pointer_dt_start <= segment.date_range_end) or    # .|.|   
126                 (pointer_dt_end <= segment.date_range_start and segment.date_range_end <= pointer_dt_end) ):        # |.|.
127                 segments_to_refresh.append(segment)
138         return sorted(segments_to_refresh, key = lambda x: x.date_range_start)

去掉124-127行,for循环里换成下面两行代码:

segment.date_range_start = pointer_dt_start 
segment.date_range_end = pointer_dt_end 

原文地址:https://www.cnblogs.com/dzqk/p/8235848.html