How to partition a set into disjoints subsets each of given size?
When $s_j = 1$ for all $j$, the problem is the same as deciding whether a bipartite graph has a perfect matching. In the general case, we can solve it using maximum flow.

Set up a flow network with the following components:


A source $s$, a sink $t$, a vertex $S_j$ for each set, and a vertex $x_i$ for each element in the universe.
Connect $s$ to each $S_j$ with an edge of capacity $s_j$.
For each $x_i \in S_j$, connect $S_j$ to $x_i$ with an infinite capacity edge.
Connect each $x_i$ to $t$ with an edge of capacity $1$.


Now compute the maximum flow. If it equals $|U|$ then the instance has a solution. Moreover, you can extract the solution from a maximum integer flow.

The max flow min cut theorem also gives us a Hall-like criterion: a solution exists if for every set $X$ of elements,
$$ \sum_{j\colon S_j \cap X \neq \emptyset} s_j \geq |X|. $$
That is, if we sum the "capacities" $s_j$ for all sets $S_j$ that intersect $X$, then we need to get at least $|X|$. This is clearly a necessary condition, and the max flow min cut theorem shows that it is sufficient.