A computer-implemented method, comprising: receiving a request to perform an inner join of stored data of a first input comprising a first set of key-value pairs and a second input comprising a second set of key-value pairs; determining, by one or more processors, a block size, the block size being a target number of values to be partitioned into a block; partitioning, by the one or more processors for each key value, the values in the first input associated with the respective key value into a first block set, which comprises blocks having the determined block size; partitioning, by the one or more processors for each key value, the values in the second input associated with the respective key value into a second block set, which comprises blocks having the determined block size; replicating, by the one or more processors for each key value, the first block set by a number of blocks in the second block set for the same key, to obtain a first replicated block set, which comprises replicated blocks that are copies of the blocks of the first block set; replicating, by the one or more processors for each key value, the second block set by a number of blocks in the first block set for the same key, to obtain a second replicated block set, which comprises replicated blocks that are copies of the blocks of the second block set; assigning, by the one or more processors, a block-key to each replicated block in the first replicated block set and each replicated block of the second replicated block set, the block-key comprising the key and additional information to identify the replicated block; distributing, by the one or more processors, each pair of replicated blocks having matching block-keys to one of a plurality of computing devices for processing; and receiving, from each of the plurality of computing devices, results for the inner join, the results for the inner join include at least one value-pair from one of the pairs of replicated blocks. receiving a request to perform an inner join of stored data of a first input comprising a first set of key-value pairs and a second input comprising a second set of key-value pairs; determining, by one or more processors, a block size, the block size being a target number of values to be partitioned into a block; partitioning, by the one or more processors for each key value, the values in the first input associated with the respective key value into a first block set, which comprises blocks having the determined block size; partitioning, by the one or more processors for each key value, the values in the second input associated with the respective key value into a second block set, which comprises blocks having the determined block size; replicating, by the one or more processors for each key value, the first block set by a number of blocks in the second block set for the same key, to obtain a first replicated block set, which comprises replicated blocks that are copies of the blocks of the first block set; replicating, by the one or more processors for each key value, the second block set by a number of blocks in the first block set for the same key, to obtain a second replicated block set, which comprises replicated blocks that are copies of the blocks of the second block set; assigning, by the one or more processors, a block-key to each replicated block in the first replicated block set and each replicated block of the second replicated block set, the block-key comprising the key and additional information to identify the replicated block; distributing, by the one or more processors, each pair of replicated blocks having matching block-keys to one of a plurality of computing devices for processing; and receiving, from each of the plurality of computing devices, results for the inner join, the results for the inner join include at least one value-pair from one of the pairs of replicated blocks.