

## 質問

以下のように型キャストをしようとすると `missing 'column' at 'partition'` というエラーが出るのは何故でしょうか。

[code]

    ALTER TABLE nekketsuuu_athena_test
    ADD
      PARTITION (dt=cast('2019-12-30' as date)) LOCATION 's3://ほにゃらら...'
    ;
    
[/code]

## 経緯

Amazon Athena (HiveQL)
において、次のようにして[パーティション分割](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html)が設定されたテーブルを作りました。

[code]

    -- S3 に適当な実データを TSV として置いています。今回の問題の原因とは関係ないはずです。
    CREATE EXTERNAL TABLE IF NOT EXISTS nekketsuuu_athena_test (
        word1 string,
        word2 string,
        word3 string,
        word4 string,
        word5 string,
        word6 string
    )
    PARTITIONED BY (dt date)
    ROW FORMAT SERDE
        'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
        'serialization.format' = '1',
        'input.regex' = 
    '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)')
    LOCATION
        's3://nekketsuuu-athena/'
    ;
    
[/code]

ここで、パーティション用に指定した列 `dt` の型は `date` になっています。

続いてパーティションを `ADD` するため、string 型から date
型へ[キャスト](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-
CastingDates)しつつ `dt` を指定するように書きました。

[code]

    ALTER TABLE nekketsuuu_athena_test
    ADD
      PARTITION (dt=cast('2019-12-30' as date)) LOCATION 's3://nekketsuuu-athena/2019/12/30'
    -- ...(省略)...
    ;
    
[/code]

しかしこれだと `line 3:3: missing 'column' at 'partition' (service: amazonathena;
status code: 400; error code: invalidrequestexception; request id:ほにゃらら)`
というエラーが出てしまいます。

替わりに `dt='2019-12-30'` と書くとエラー無しで想定通りに動きました。

[code]

    ALTER TABLE nekketsuuu_athena_test
    ADD
      PARTITION (dt='2019-12-30') LOCATION 's3://nekketsuuu-athena/2019/12/30'
    ;
    
[/code]

また `dt=DATE '2019-12-30'` でも OK
でした（上手くドキュメントを見つけられませんでしたが、[おそらく](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-
TimestampstimestampTimestamps)これが `date` 型のリテラルの記法です）。

[code]

    ALTER TABLE nekketsuuu_athena_test
    ADD
      PARTITION (dt=DATE '2019-12-30') LOCATION 's3://nekketsuuu-athena/2019/12/30'
    ;
    
[/code]

`dt` は `date` 型なのに、どうして型キャストだとエラーが出るのでしょうか。また、`string` から `date`
への[暗黙の型変換はできない](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-
AllowedImplicitConversions)のに、文字列リテラルのみでもエラーが出ないのはなぜでしょうか？


CC BY-SA 4.0
2020-02-06T00:43:15.433
62813
2020-02-06T00:55:04.483
2020-02-06T00:55:04.483
19110
19110
question
aws sql
Athena/HiveQLのADD PARTITIONで型キャストはできない？