Optiq supports duplicate aliases in SQL too (see https://github.com/julianhyde/optiq/commit/f7158805013c03f9e0252cb7808c26358a5c111c). But it does it without duplicate names in RelNode records. That would make this case easier, but some other things more difficult.
Optiq's JDBC driver gets the column names from the validated AST. Could Hive do the same?
It's also possible that some other properties of the output columns, e.g. their precise type, change during the optimization process. That's another reason to keep the logical type info around.
By the way, at one point I considered banning duplicate expressions (regardless of their names) in "ProjectRel($0, $0)" because they are usually wasteful and confusing to other rules. But I relented because you sometimes need 'select a, a ...' at the top level and in the child of a union.