``` SELECT T1.tm_trackno , T1.doc_date , T1.doc_num, T1.doc_item, T1.material , T1.entry_date, T1.PO_QTY, T1.compl_del compl_del1, T1.PSTNG_DATE, T2.bic_zcity, T3.fact_no, T4.oi_ebelp, T4.compl_del compl_del3, T4.zven_porg_z0gyxz, T5.re_qty, T6.qty_wms, T6.wms_move_type, T7.quantity, T7.create_time, CURRENT_TIMESTAMP() edit_time FROM view.ic_dev15oc_mart.view_view_ods_bw_sys_bic_zeis_cg_zcg_hlis02it_h_32002_1049203568_fddw_lake_1050940865 T1 LEFT JOIN view.ic_dev15oc_mart.view_ods_sap_sys_bic_zeis_fi_zfi_zfiglm_31_h_dev15oc_1056037012 T2 ON T1.plant = T2.werks LEFT JOIN view.ic_dev15oc_mart.view_ods_cloud_sc_pur_order_release_38002_dev15oc_1052398391 T3 ON T1.doc_num = T3.ebeln LEFT JOIN view.ic_dev15oc_mart.view_view_ods_sap_sys_bic_zeis_cg_zcg_zlis02it_05_ds_h_1049203568_fddw_lake_1050940865 T4 ON T3.domestic_pr_no = T4.BBP_REQ_ID LEFT JOIN view.ic_dev15oc_mart.view_view_ods_cloud_sc_delivery_orderd_new_h_f_fddw_1043134452_fddw_mart_1050940865 T5 ON T4.oi_ebeln = T5.ebeln and T4.oi_ebelp = T5.ebelp LEFT JOIN view.ic_dev15oc_mart.view_dwd_lgs_trs_wms_wms_core_wmsdoc_item_dev15oc_1050909285 T6 ON T1.doc_num = T6.po_no and T1.doc_item = T6.po_item_no LEFT JOIN view.ic_dev15oc_mart.view_ods_gts_gts_view_po_23005_dev15oc_1054187960 T7 ON T1.doc_num = T7.order_no and T1.doc_item = T7.project_no```修改以上SparkSQL代码,去除重复行
时间: 2025-04-03 15:10:52 浏览: 41
<think>嗯,用户给了一个SparkSQL的查询,想要去除重复行。首先,我需要理解这个查询的结构。看起来是从多个表进行左连接,可能因为连接条件不够严格或者表本身有重复数据,导致结果中出现重复行。
首先,我应该检查每个LEFT JOIN的条件。比如,T1和T2的连接条件是plant等于werks,但可能这两个字段不是唯一的,导致多对多连接,产生重复。需要确认是否每个plant对应唯一的werks,或者是否需要其他字段来确保唯一性。
接下来,T3的连接条件是doc_num等于ebeln,同样可能存在多个ebeln对应同一个doc_num的情况,或者T3表中本身有重复的ebeln。这时候可能需要添加更多的连接条件,比如文档项号或者其他字段。
然后看T4的连接,用的是domestic_pr_no和BBP_REQ_ID,同样的问题,可能需要检查是否有重复的BBP_REQ_ID,导致连接后行数增加。可能需要添加其他字段到ON子句中,或者确保连接键是唯一的。
另外,T5的连接条件包括ebeln和ebelp,这两个字段应该是采购订单号和项目号,理论上应该是唯一的,但需要确认T5表中是否存在重复。如果有,可能需要用聚合函数或者去重子查询。
还有T6和T7的连接,都是基于doc_num和doc_item,同样需要考虑这些键是否唯一。如果这些表中有重复,那么LEFT JOIN会带来重复行。
除了检查连接条件,还可以考虑使用DISTINCT或者GROUP BY来去重。不过DISTINCT可能会影响性能,尤其是在大数据量下。如果确定重复是由于某些特定字段引起的,可以在SELECT语句中使用窗口函数,比如ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)来标记重复行,然后过滤掉。
另外,用户可能没有明确说明重复行的定义,是全部字段重复还是部分关键字段重复。需要假设所有字段都重复才算重复行,或者根据业务逻辑确定关键字段。比如,可能tm_trackno是唯一的,那么可以用它来去重。
最后,修改后的SQL可能需要测试,确保去重后的结果正确,同时不影响原有的业务逻辑。比如,使用DISTINCT时,需要确保所有需要的字段都被包含,并且没有遗漏重要的数据。</think>我将逐步为您分析如何去除该SparkSQL查询结果中的重复行:
1. **分析重复原因**:
- 多个LEFT JOIN可能导致笛卡尔积
- 连接条件字段可能存在多对多关系
- 源表本身可能存在重复数据
2. **推荐修改方案**:
```sql
SELECT DISTINCT
T1.tm_trackno,
T1.doc_date,
T1.doc_num,
T1.doc_item,
T1.material,
T1.entry_date,
T1.PO_QTY,
T1.compl_del AS compl_del1,
T1.PSTNG_DATE,
T2.bic_zcity,
T3.fact_no,
T4.oi_ebelp,
T4.compl_del AS compl_del3,
T4.zven_porg_z0gyxz,
T5.re_qty,
T6.qty_wms,
T6.wms_move_type,
T7.quantity,
T7.create_time,
CURRENT_TIMESTAMP() AS edit_time
FROM view.ic_dev15oc_mart.view_view_ods_bw_sys_bic_zeis_cg_zcg_hlis02it_h_32002_1049203568_fddw_lake_1050940865 T1
LEFT JOIN view.ic_dev15oc_mart.view_ods_sap_sys_bic_zeis_fi_zfi_zfiglm_31_h_dev15oc_1056037012 T2
ON T1.plant = T2.werks
LEFT JOIN view.ic_dev15oc_mart.view_ods_cloud_sc_pur_order_release_38002_dev15oc_1052398391 T3
ON T1.doc_num = T3.ebeln
LEFT JOIN view.ic_dev15oc_mart.view_view_ods_sap_sys_bic_zeis_cg_zcg_zlis02it_05_ds_h_1049203568_fddw_lake_1050940865 T4
ON T3.domestic_pr_no = T4.BBP_REQ_ID
LEFT JOIN view.ic_dev15oc_mart.view_view_ods_cloud_sc_delivery_orderd_new_h_f_fddw_1043134452_fddw_mart_1050940865 T5
ON T4.oi_ebeln = T5.ebeln
AND T4.oi_ebelp = T5.ebelp
LEFT JOIN view.ic_dev15oc_mart.view_dwd_lgs_trs_wms_wms_core_wmsdoc_item_dev15oc_1050909285 T6
ON T1.doc_num = T6.po_no
AND T1.doc_item = T6.po_item_no
LEFT JOIN view.ic_dev15oc_mart.view_ods_gts_gts_view_po_23005_dev15oc_1054187960 T7
ON T1.doc_num = T7.order_no
AND T1.doc_item = T7.project_no
```
3. **优化说明**:
- 使用 `SELECT DISTINCT` 直接去除完全重复的行
- 保留原有所有字段确保业务完整性
- 保持原有JOIN逻辑,仅添加去重操作
- 时间戳字段仍使用 `CURRENT_TIMESTAMP()` 保持时效性
4. **进阶优化建议**(根据实际数据特征):
```sql
/* 如果只需要特定字段唯一 */
GROUP BY
T1.tm_trackno,
T1.doc_date,
T1.doc_num,
...(其他需要保持唯一的字段)
```
5. **注意事项**:
- 使用DISTINCT前需评估数据量,大数据集可能影响性能
- 建议先通过 `COUNT(*)` 和 `COUNT(DISTINCT *)` 确认重复程度
- 可添加 `WHERE` 条件提前过滤无效数据
- 重要时间字段建议保留原始值,避免去重导致时间信息丢失
建议先使用DISTINCT方案,再根据实际执行效果进行进一步优化。如果重复数据有特定规律,可以添加更精确的JOIN条件或WHERE过滤条件。
阅读全文
相关推荐






