void putSplitIntoQueue(final MixedFormatSplit split) {
    List<DataTreeNode> exactlyTreeNodes = getExactlyTreeNodes(split);

    PrimaryKeyedFile file = findAnyFileInSplit(split);

    for (DataTreeNode node : exactlyTreeNodes) {
      long partitionIndexKey = Math.abs(file.partition().toString().hashCode() + node.index());
      int subtaskId =
          partitionIndexSubtaskMap.computeIfAbsent(
              partitionIndexKey, key -> (partitionIndexSubtaskMap.size() + 1) % totalParallelism);
      LOG.info(
          "partition = {}, (mask, index) = ({}, {}), subtaskId = {}",
          file.partition().toString(),
          node.mask(),
          node.index(),
          subtaskId);

      PriorityBlockingQueue<MixedFormatSplit> queue =
          subtaskSplitMap.getOrDefault(subtaskId, new PriorityBlockingQueue<>());
      MixedFormatSplit copiedSplit = split.copy();
      copiedSplit.modifyTreeNode(node);
      LOG.info("put split into queue: {}", copiedSplit);
      queue.add(copiedSplit);
      totalSplitNum = totalSplitNum + 1;
      subtaskSplitMap.put(subtaskId, queue);
    }
  }
Key is subtaskId, Value is the queue of unAssigned mixed-format splits.
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/read/hybrid/assigner/ShuffleSplitAssigner.java