批计算谓词下推配置

批计算中的多元索引查询方式可以自定义谓词下推配置。目前只能设置与Long、String类型的列做大小比较的谓词是否下推。

背景信息

谓词下推适用于当多元索引中多字段过滤的中间结果数据量较大,则中间结果的合并较为耗时的场景。此时可以将某些字段的过滤从存储层(表格存储)提到计算层(Spark)处理,提高查询效率。

例如select * from table where a = 10 and b < 999999999;,如果a = 10返回的结果只有1000条,b < 999999999返回的结果有一亿条,则在存储层将1000条结果与一亿条结果做合并比较耗时,此时把b < 999999999提到计算层,Spark只需要对存储层返回的1000条数据作过滤,大大降低了存储层的压力。

谓词支持

Spark谓词支持情况请参见下表。

Spark

是否支持

SQL语句举例

And

select * from table where a > 1 and b < 0;

Or

select * from table where a > 1 or b < 0;

Not

select * from table where a != 1;

EqualTo

select * from table where a = 1;

Not+EqualTo

select * from table where a != 1;

IsNull

select * from table where a is null;

返回table数据表中没有a列的行。

In

select * from table where a in {1,2,3};

默认最大限制为1024。

LessThan

select * from table where a < 10;

SQL语句中使用该谓词的列的数据类型为Long或者String时,可以自定义谓词下推配置。

LessThanOrEqual

select * from table where a <=10;

SQL语句中使用该谓词的列的数据类型为Long或者String时,可以自定义谓词下推配置。

GreaterThan

select * from table where a > 10;

SQL语句中使用该谓词的列的数据类型为Long或者String时,可以自定义谓词下推配置。

GreaterThanOrEqual

select * from table where a >= 10;

SQL语句中使用该谓词的列的数据类型为Long或者String时,可以自定义谓词下推配置。

StringStartsWith

select * from table where a like "tablestore%";

返回table数据表中a列以tablestore为前缀(prefix)的行。

地理坐标(String JSON)中心距离

select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}';

由中心点和距离决定的地理圆圈范围。

地理坐标(String JSON)长方形

select * from table where geo = '{"topLeft":"8,0", "bottomRight": "0,10"}';

由左上角和右下角决定的地理长方形范围。

地理坐标(String JSON)多边形

select * from table where geo = '{"points":["5,0", "5,1", "6,1", "6,10"]}';

由多个点组成的地理多边形范围。

谓词下推配置

谓词下推配置的参数需要在创建Spark外表时配置。谓词下推规则如下:

  • 当过滤条件中的逻辑谓词只存在ANDNOT可以自定义谓词是否下推。

  • 当过滤条件中的逻辑谓词存在OR谓词全部下推,自定义的谓词下推配置(例如E-MapReduce SQL方式的参数配置push.down.range.long=falsepush.down.range.string=false)不会生效

不同的逻辑谓词和下推配置组合使用时,SQL语句举例及预期效果请参见下表。

逻辑谓词

下推配置

SQL语句举例

预期效果

全为AND

  • push.down.range.long=true

  • push.down.range.string=true

select * from table where val_long1 > 1000 and val_long1 is null and name like 'table%' and pk in {12341,213432};

SQL正常。

谓词全部下推。

全为AND

  • push.down.range.long=false

  • push.down.range.string=true

select * from table where val_long1 > 1 and name like 'table%';

Long类型做大小比较的谓词不会下推。

该谓词由Spark计算层进行过滤,Spark计算层获取name like 'table%'的数据,val_long1 > 1由业务代码进行过滤。

全为AND

  • push.down.range.long=true

  • push.down.range.string=false

select * from table where val_string1 > 'string1' and name like 'table%';

String类型做大小比较的谓词都不会下推。

该谓词交由Spark计算层进行过滤,Spark计算层获取name like 'table%'的数据,val_string1 > 'string1'由业务代码进行过滤。

全为AND

存在地理位置类型列

select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}' and val_long1 = 37691900 and val_long2 > 2134234;

SQL正常。

val_long2 > 2134234能否由Spark计算层过滤取决于push.down.range.long的配置。

存在OR

  • push.down.range.long=true

  • push.down.range.string=true

select * from table where val_long1 > 1000 or val_long1 is null or name like 'table%' and pk in {12341,213432};

SQL正常。

谓词全部下推。

存在OR

存在地理位置类型列

select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}' or val_long1 = 37691900;

SQL正常。

谓词全部下推。

存在OR

  • push.down.range.long=false

  • push.down.range.string=true

  • SQL语句中存在rangeLong的过滤字段

select * from table where val_long1 > 1 or name like 'table%';

此时自定义谓词配置不生效,谓词全部下推。

存在OR

  • push.down.range.long=true

  • push.down.range.string=false

  • SQL语句中存在rangeString的过滤字段

select * from table where val_string1 > 'string1' or name like 'table%';

此时自定义谓词配置不生效,谓词全部下推。