private void split() {
    fileScanTasks.forEach(
        (structLike, fileScanTasks1) -> {
          for (NodeFileScanTask task : fileScanTasks1) {
            if (task.dataTasks().size() < 2) {
              splitTasks.add(task);
              continue;
            }

            if (splitTaskByDeleteRatio != null) {
              long deleteWeight =
                  task.mixedEquityDeletes().stream()
                      .mapToLong(s -> s.file().fileSizeInBytes())
                      .map(s -> s + openFileCost)
                      .sum();

              long dataWeight =
                  task.dataTasks().stream()
                      .mapToLong(s -> s.file().fileSizeInBytes())
                      .map(s -> s + openFileCost)
                      .sum();
              double deleteRatio = deleteWeight * 1.0 / dataWeight;

              if (deleteRatio < splitTaskByDeleteRatio) {
                long targetSize =
                    Math.min(
                        new Double(deleteWeight / splitTaskByDeleteRatio).longValue(), splitSize);
                split(task, targetSize);
                continue;
              }
            }

            if (task.cost() <= splitSize) {
              splitTasks.add(task);
              continue;
            }
            split(task, splitSize);
          }
        });
  }
Config this scan with filter by the {@link Expression}. For Change Table, only filters related
to partition will take effect.

@param expr a filter expression
@return scan based on this with results filtered by the expression
amoro-format-iceberg/src/main/java/org/apache/amoro/scan/BasicKeyedTableScan.java