ハイブ外部テーブルからのデータのフェッチに完全に行き詰まりました。私は今まで以下を行ってきました。
- 値が 2014-10-23 の日付フィールドを持つ管理対象テーブルがありました。
以下のようなエラスティック検索でデータを保存するための外部テーブルを作成しました
外部テーブル ext3 を作成します ( run_date date) ROW FORMAT SERDE 'org.elasticsearch.hadoop.hive.EsSerDe' STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'dfs/ext3', ' es.field.read.empty.as.null' = 'true','es.nodes'=);
外部テーブルに 1 行を挿入して、Elastic Search インデックスとマッピングを作成します。
問題 1: エラスティック検索フィールドが文字列として作成されます。
後で、エラスティック検索のマッピングを日付に変更しました。
"run_date":{"type":"date", "format": "yyyy-MM-ddZ", "index": "not_analyzed"}
外部テーブルにデータを再挿入しました。エラスティック検索をクエリすると、非常にうまくいきます。値は「2014-10-23+08:00」と表示されます
問題 2 select count(*) from ext3 のような外部テーブルのデータをクエリすると、以下のエラーが発生します。
2015-04-17 18:45:34,254 FATAL [main] org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row [Error getting row data with exception java.lang.ClassCastException: org.apache.hadoop.hive.serde2.io.TimestampWritable cannot be cast to org.apache.hadoop.hive.serde2.io.DateWritable
at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableDateObjectInspector.getPrimitiveWritableObject(WritableDateObjectInspector.java:38)
at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:259)
at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:349)
at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:193)
at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:179)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:545)
みんなこれで私を助けてください、一日が無駄です。より多くのデータを含む別の外部テーブルがあり、これら 2 つのテーブルを結合してビューを作成し、統合されたデータを分析できるようにする必要があります。