code: public void splitShards(int targetNumShards) {
      int origionalShardCount = getShardCount();
      int splitFactor = targetNumShards / origionalShardCount;
      if (splitFactor <= 1) {
        return;
      }
      List<List<String>> oldAllFiles = allFiles;
      shardCount = splitFactor * origionalShardCount;
      allFiles = initAllFiles(shardCount);
      int shard = 0;
      for (List<String> files : oldAllFiles) {
        if (!files.isEmpty()) {
          for (List<String> forShard : SplitUtil.split(files, splitFactor, false)) {
            addFilesToShard(shard++, forShard);
          }
        }
      }
    }
docs: Splits the provided input if needed to ensure there are approximately {@code targetNumShards}
  shards. (Note that it will not combine files from different input shards into a single output
  shard)