Joiner is a horizontal expansion of two data sources based on some condition. While Union is a vertical expansion of two sources without any condition. Lookup behaves like a detail outer join but we can't say it as a subset of joiner because in Joiner you can use only equal operator in join condition but in lookup you can use other relational opearator like > , >=, <, <=.
Union doesn't use cache but joiner and lookup may use cache. Union needs compatibilty structure to peform its opeartion but joiner and lookup doesn't need compatiblity.