我遇到了以下行,无法理解为什么会这样。
where cast(date_str as date) between date_sub(date '{start_date_str}', 28)
and date_sub(date '{start_date_str}', 1)
根据Hive文档,date_sub
的第一个参数应该是一个字符串。那么为什么作者明确地在2个字符串前加上date
个关键字?
类型转换的语法糖是wanted_type expr
吗?根据Hive文档,正确的强制语法应该是cast(expr as wanted_type)
答案 0 :(得分:1)
谢谢你的提问。
我刚刚更新了LanguageManual UDF页面
DATE 'YYYY-MM-DD'
在Hive的开头,不支持date
类型,因此日期函数使用了string
个参数。
文档似乎已过时,目前date_add
和date_sub
除了string
,date
和timestamp
作为第一个参数。< / p>
.
.
.
public class GenericUDFDateSub extends GenericUDFDateAdd {
private transient SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
public GenericUDFDateSub() {
this.signModifier = -1;
}
.
.
.
.
.
.
switch (inputType1) {
case STRING:
case VARCHAR:
case CHAR:
inputType1 = PrimitiveCategory.STRING;
dateConverter = ObjectInspectorConverters.getConverter(
(PrimitiveObjectInspector) arguments[0],
PrimitiveObjectInspectorFactory.writableStringObjectInspector);
break;
case TIMESTAMP:
dateConverter = new TimestampConverter((PrimitiveObjectInspector) arguments[0],
PrimitiveObjectInspectorFactory.writableTimestampObjectInspector);
break;
case DATE:
dateConverter = ObjectInspectorConverters.getConverter(
(PrimitiveObjectInspector) arguments[0],
PrimitiveObjectInspectorFactory.writableDateObjectInspector);
break;
default:
throw new UDFArgumentException(
" DATE_ADD() only takes STRING/TIMESTAMP/DATEWRITABLE types as first argument, got "
+ inputType1);
}
.
.
.