delta (OSS) + MERGE воссоздает базовые файлы паркета, хотя во входящих данных нет изменений

Я использую дельту (OSS - версия 0.7.0 с pyspark 3.0.1), и таблица модифицируется (объединяется) каждые 5 минут - сценарий microbatch pyspark.

Когда я запускаю в первый раз, он создал 18 небольших файлов (numTargetRowsInserted -> 32560), и я использовал те же данные и перезапустил снова, хотя в данных нет изменений, таблица затронута, версия обновлена ​​и количество маленьких файлов увеличилось до 400, а ранее добавленные 18 файлов были помечены как удаленные. Однако, за исключением первого MERGE, последующее слияние имеет следующие значения numTargetRowsCopied -> 32560 в OperationMetics. Почему целевые строки копируются снова, а старые файлы помечаются как удаленные? Я что-то упустил?

Данные OperationMetrics приведены ниже.

OperationMetrics |

[NumTargetRowsCopied -›32560, NumTargetRowsDeleted -› 0, NumTargetFilesDadd -›18, executionTimems -› 0, NumTargetRowsInserted -›0, ScantImems -› 320-, numTargetRowsUpdated -›0, NumOutputRows -› 3260 -ilrowsupdatupd , переписатьTimeMs -> 66410]|

[NumTargetRowsCopied -›32560, NumTargetRowsDeleted -› 0, NumTargetFilesDadd -›400, executionTimems -› 0, NumTargetRowsInserted -›0, ScantiMems -› 320-, numTargetRowsUpdated -›0, NumOutputrows -› 320 -illowsupdupd , переписатьTimeMs -> 48810]|

[NumTargetRowsCopied -›32560, NumTargetRowsDeleted -› 0, NumTargetFilesDadd -›18, executionTimems -› 0, NumTargetRowsInserted -›0, ScantiMems -› 3256-, numTargesUpdated -›0, numOutputRows -› 320 -illowsupdated -›0, numbrowsupad , переписатьTimeMs -> 15039] |

[NumTargetRowsCopied -›32560, numTargetRowsDeleted -› 0, NumTargetFilesDadd -›18, executionTimems -› 0, NumTargetRowsInserted -›0, Scantimems -› 3244, numTargetRowSupDated -›0, NumOutputRows -› 320 -ilourowsupdated -›0, numbrowsupad , переписатьTimeMs -> 14828] |

[NumTargetRowsCopied -›32560, NumTargetRowsDeleted -› 0, NumTargetFilesDadd -›18, executionTimems -› 0, NumTargetRowsInserted -›0, ScantImems -› 320-, numTargetRowsUpdated -›0, NumOutputRows -› 3260 -ilourowsupd , переписатьTimeMs -> 70194]|

[NumTargetRowsCopied -›32560, NumTargetRowsDeleted -› 0, NumTargetFilesDadd -›400, executionTimems -› 0, NumTargetRowsInserted -›0, ScantiMems -› 320-, numTargetRowsUpdated -›0, NumOutputRows -› 320 -illowsupdupd , переписатьTimeMs -> 80719]|

[NumTargetRowsCopied -›0, NumTargetRowsDeleted -› 0, NumTargetFilesAdded -›18, executionTimemes -› 0, NumTargetRowsInserted -›32560, Scantimems -› 7035, NumTargetRowSupDated -›0, NumOutputRows -› 320 -ilourowsUpdated -›0, numpulowsupdated -› 0, numbrowsupad , переписатьTimeMs -> 11606] |

Объединить SQL:

MERGE INTO Target_table tgt
USING Source_table src
ON src.pk_col = tgt.pk_col
WHEN MATCHED AND src.operation=="DELETE" THEN DELETE
WHEN MATCHED AND src.operation=="UPDATE" THEN UPDATE SET *
WHEN NOT MATCHED AND src.operation!="DELETE" THEN INSERT *

person Rak    schedule 20.04.2021    source источник


Ответы (2)


Это известное поведение Delta — он перезаписывает каждый файл, который имеет совпадающую запись в предложении ON, независимо от условия для WHEN MATCHED / WHEN NOT MATCHED.

В вашем случае, если вы используете те же данные, у вас все еще есть совпадения с данными в таблице, поэтому условие ON выполняется, а затем, когда оно проходит через MATCHED/NOT MATCHED, оно ничего не находит. Чтобы избежать этого, вам нужно подумать о том, как вы можете изменить условие, чтобы оно было более конкретным.

Ознакомьтесь с этим разговором (и слайдами) – он объясняет, как работает MERGE.

person Alex Ott    schedule 21.04.2021
comment
Спасибо Алекс.! Проверим.! - person Rak; 21.04.2021

Привет, попробуй увидеть это для основных рекомендаций.

  1. Я рекомендую использовать раздел для минимизации стоимости операций слияния.
  2. напишите с объединением 1, это гарантирует 1 файл на раздел, но следите за кардинальностью столбцов, выбранных для раздела

мой случай

person Cristián Vargas Acevedo    schedule 21.04.2021
comment
Спасибо Кристен.! я получил номер 1 - person Rak; 21.04.2021
comment
Для № 2, как обеспечить 1 файл на раздел? Я думал, что придется делать уплотнение на дельте после слияния. - person Rak; 21.04.2021
comment
только создайте таблицу с коалесом (1) и проверьте файлы по разделам, это зависит от вашей конфигурации искры и исполнителей, см. это: stackoverflow.com/questions/31674530/ - person Cristián Vargas Acevedo; 21.04.2021