【详述】StarRocks内表join连接另一张对象存储orc文件外部表,连接条件中存在文件外部表筛选条件(sal_source_type=‘PO’),但是在计算结果中出现了不符合连接条件的数据(sal_source_type=‘PLAN’)。文件外部表全表总数据行列规模为大约8000万行*700列。执行查询过程中内表与文件外表数据均没有任何变动。
反复测试,计算错误问题可以100%稳定复现,即使先对文件外部表执行analyze也无效。但在两种操作处理下计算结果可以恢复正确:
1、不改变两表连接条件,将select文件外表的字段数量减少。如截图动图演示。
2、不改变两表连接条件,增加where过滤条件,对文件外表增加更多过滤,例如从8000万行过滤降低到5700万行左右,此时计算结果正确。
但以上两种方法均不可满足实际业务需要。
另外,将该文件外表导入为内表,再使用内表代入原SQL替换掉文件外表,重新尝试查询,计算结果正确。
【背景】文件外部表的数据由Spark计算并以orc格式写入华为云OBS对象存储
【业务影响】分析报表结果不正确
【是否存算分离】否
【StarRocks版本】3.1.5
【集群规模】例如:2fe(1 leader + 1 follower)+ 8be(FE、BE独立部署,k8s)
【机器信息】FE规格=12cores 20GB mem,BE规格=16cores 120GB mem
【联系方式】微信群“StarRocks社区群14”,微信群昵称:CrazyRen
【附件】
以下是错误连接数据时的SQL的执行计划:
PLAN FRAGMENT 0
OUTPUT EXPRS:1: sal_asn_line_id | 3: sal_tenant_id | 145: sah_company_id | 285: ospll_po_line_location_id | 894: expr | 425: ospl_po_line_id | 67: sal_source_type | 895: expr
PARTITION: UNPARTITIONED
RESULT SINK
5:EXCHANGE
PLAN FRAGMENT 1
OUTPUT EXPRS:
PARTITION: RANDOM
STREAM DATA SINK
EXCHANGE ID: 05
UNPARTITIONED
4:Project
| <slot 1> : 1: sal_asn_line_id
| <slot 3> : 3: sal_tenant_id
| <slot 67> : 67: sal_source_type
| <slot 145> : 145: sah_company_id
| <slot 285> : 285: ospll_po_line_location_id
| <slot 425> : 425: ospl_po_line_id
| <slot 894> : 448: ospl_entered_tax_included_price * 17: sal_quantity
| <slot 895> : 'NEW'
|
3:HASH JOIN
| join op: LEFT OUTER JOIN (BROADCAST)
| colocate: false, reason:
| equal join conjunct: 69: sal_source_line_id = 425: ospl_po_line_id
| other join predicates: 67: sal_source_type = 'PO'
|
|----2:EXCHANGE
|
0:OlapScanNode
TABLE: dwd_logistics_slod_asn_line_1d
PREAGGREGATION: ON
PREDICATES: 3: sal_tenant_id IN (127985, 1723), 145: sah_company_id IN (1743, 152398)
partitions=1/1
rollup: dwd_logistics_slod_asn_line_1d
tabletRatio=16/16
tabletList=14382674,14382677,14382680,14382683,14382686,14382689,14382692,14382695,14382698,14382701 ...
cardinality=1493
avgRowSize=48.000053
numNodes=0
PLAN FRAGMENT 2
OUTPUT EXPRS:
PARTITION: RANDOM
STREAM DATA SINK
EXCHANGE ID: 02
UNPARTITIONED
1:FileTableScanNode
TABLE: dwd_order_sodr_po_line_location_1d
cardinality=1
avgRowSize=3.0
numNodes=0