I think the biggest difference is dynamic (river) vs manual tiling (sway). Other than that, I feel sway is much more mature and there's a proper community surrounding it that had written scripts and tools that work with sway. Many of which you are probably gonna use with river as well (swaylock, swaybg, swayidle).
One thing that's pretty cool about river (at least in theory) is that the tiling algorithm is not part of the compositor itself. Instead, you can run any river tiling program and have that part be completely custom if you wish. Also configuration is done via commands instead of a config language (you usually run a bash script at start).
From what I remember, the vision of Isaac Freund (main developer) is, that river will become more of a tiling compositor base, that others can then use to create their own distributions. I heard that in some talk he gave. You should be able to find that on YouTube.
However, there's still a long way to go.
In it's current state, river reminds me of spectrwm. Very simple, with some cool, but ultimately non-essential, ideas that you probably won't find anywhere else.
You're welcome. I've been using it as my daily driver for over a year now and it works for that, but don't expect any bells and whistles.