山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

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にデータは残る

原因とか詳細の調査

細かい事はよくわからなかった。誰か教えてください。

以下は推測とか。

通常版のcreate tableを実行する事による懸念とか

  • 「external」が通常版の構文にはないが、外部テーブルを使用したい
    • locationを指定する事で暗黙的に外部テーブルとして扱われるため問題ない。(tableのdropなどで試した)

参考URL

直接は関係なかったけどメモ的なURL