I worked at Uber a long time ago - there was some amount of overcomplicated engineering but you genuinely can't completely shard by city because a big part of Uber's value proposition is that you fly into a city for the first time and Uber just works.
You probably know much better than I do, but that doesn't seem it would make it impossible to do sharding? You just pick a shard based on the current location of the driver/customer.
It has been a long time and my memory is based on hearing about it rather than using it, but I believe there was a notion of a rider's "home" datacenter (based on where they signed up from), and there was some complexity from propagating a rider's data from there to all other datacenters proactively, so that things would just work no matter where in the world they were. And I think the datacenter serving the area where a user was currently located could accept writes for that user, meaning that it would have to get written back to the home datacenter... you can see how this got complicated.