2017-02-17 14 views
1

私は次のような行を見つけ、それがなぜ機能するのか理解できませんでした。date_sub(DATE文字列、int)の "DATE"は何をしますか?

where cast(date_str as date) between date_sub(date '{start_date_str}', 28) 
and date_sub(date '{start_date_str}', 1) 

ハイブのドキュメントによると、date_subの第一パラメータは文字列でなければなりません。では、なぜ著者は明示的にdateというキーワードを2つの文字列の前に置いていますか?

wanted_type expr構文型式変換用の砂糖ですか? Hiveのドキュメントによると、キャストの正しい構文はcast(expr as wanted_type)

答えて

1

ありがとうございます。
は、私はちょうどLanguageManual UDFページ


  1. にリテラル日付を注意するためにISO/ANSIの道を日付関数を使用してdateタイプがサポートされていなかったハイブの開始時にDATE 'YYYY-MM-DD'
  2. される更新しました引数。

  3. ドキュメントがstringdateと最初の引数としてtimestampを除き、現在date_adddate_sub期限が切れたと思われます。

GenericUDFDateSub.java

. 
. 
. 
public class GenericUDFDateSub extends GenericUDFDateAdd { 
    private transient SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 

    public GenericUDFDateSub() { 
    this.signModifier = -1; 
    } 
. 
. 
. 

GenericUDFDateAdd.java

. 
. 
. 
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); 
} 
. 
. 
. 
関連する問題