databricksでcreate tableを行った際にParquet does not support timestamp. See HIVE-6384が発生する
エラー詳細
stacktraceは長いので割愛
com.databricks.backend.common.rpc.DatabricksExceptions$SQLExecutionException: org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Parquet does not support timestamp. See HIVE-6384;
発生事象
databricksで下記のcreate table文を実行した際に上記のエラーが発生する。
%sql create external table if not exists yamap55.hoge( HOGE_ID string comment 'HOGE_ID', HOGE_TIMESTAMP timestamp comment 'HOGE_TIMESTAMP' ) comment 'hoge' partitioned by ( TARGET_DATE string comment 'TARGET_DATE' ) stored as parquet location 's3a://aaaaa/bbbbbb/data/hoge' tblproperties ( 'parquet.compress'='SNAPPY' ) ;
再現する最小構成↓
%sql create table if not exists yamap55.hoge( HOGE_TIMESTAMP timestamp comment 'HOGE_TIMESTAMP' ) stored as parquet ;
回避方法
詳細は長くなるので先に回避方法を記載。
- 通常のcreate table文を使用する事で回避が可能です。
具体的には以下
%sql create table if not exists yamap55.hoge( HOGE_ID string comment 'HOGE_ID', HOGE_TIMESTAMP timestamp comment 'HOGE_TIMESTAMP', TARGET_DATE string comment 'TARGET_DATE' ) using parquet comment 'hoge' partitioned by ( TARGET_DATE ) location 's3a://aaaaa/bbbbbb/data/hoge' tblproperties ( 'parquet.compress'='SNAPPY' ) ;
注意事項
- hive形式との差分が多いので構文に注意(下記は一例)
- 「external」の記載は不要(詳細は下記「通常版のcreate tableを実行する事による懸念とか」参照)
- column定義にpartitionで使用する列も記載
- 「stored as」 → 「using」
- 「using」の記載順
- 外部テーブル指定(external)がないが、「location」を指定する事で暗黙的に外部テーブルとして扱われる。
- テーブルをdropしてもS3にデータは残る
原因とか詳細の調査
細かい事はよくわからなかった。誰か教えてください。
以下は推測とか。
- 発生しているエラー自体はhive 1.2で解決済み。
- databricksのhiveは1.2.1と思われる
- コードやコマンドで直接hiveのバージョンを見る方法はわからなかった
- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.12/2.4.3
- sparkのバージョンは2.4.3
ls /databricks/jars | grep hive
- 上記により、何故本事象が発生するのかは不明。
create tableの際に何らかの理由により低いバージョンのhiveが使用されているのではないか。
create tableには通常版とhive formatの2種類がある。
- 今回の事象が発生するのはhive formatの場合。
- 通常版で実行する事で本事象を回避できる
通常版のcreate tableを実行する事による懸念とか
- 「external」が通常版の構文にはないが、外部テーブルを使用したい
- locationを指定する事で暗黙的に外部テーブルとして扱われるため問題ない。(tableのdropなどで試した)
参考URL
- Hive Table Creation - Parquet does not support Timestamp Datatype?
- databricksのフォーラム。全く同じ事聞いてます。よく読みましょう。
- https://forums.databricks.com/questions/1957/hive-table-creation-parquet-does-not-support-times.html
- Create Table
- hiveの該当issue
直接は関係なかったけどメモ的なURL
- hiveのバージョンによる制限事項
- hiveのバージョンを調べる方法
- spark2.4.3の依存jar(maven central)