Используемый вами формат неверен.Верхний / нижний регистр имеет большое значение .Правильный формат: 'yyyyMMdd'.
Date_sub для корректной работы требуется yyyy-MM-dd, при необходимости выполните преобразование.
select date_sub(from_unixtime(unix_timestamp('20180912','yyyyMMdd')),20) ;
OK
2018-08-23
Cast as timestamp
дает неправильный результат (1970 год), возможно, это проблема в моей версии Hive (1.2.1) :
select cast(unix_timestamp('20180912','yyyyMMdd') as timestamp);
OK
1970-01-18 18:51:50.4
Использовать from_unixtime(unix_timestamp('20180912','yyyyMMdd'))
для преобразования,работает нормально.