1

ハイブ外部テーブルからのデータのフェッチに完全に行き詰まりました。私は今まで以下を行ってきました。

  1. 値が 2014-10-23 の日付フィールドを持つ管理対象テーブルがありました。
  2. 以下のようなエラスティック検索でデータを保存するための外部テーブルを作成しました

    外部テーブル 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'=);

  3. 外部テーブルに 1 行を挿入して、Elastic Search インデックスとマッピングを作成します。

問題 1: エラスティック検索フィールドが文字列として作成されます。

  1. 後で、エラスティック検索のマッピングを日付に変更しました。

    "run_date":{"type":"date", "format": "yyyy-MM-ddZ", "index": "not_analyzed"}

  2. 外部テーブルにデータを再挿入しました。エラスティック検索をクエリすると、非常にうまくいきます。値は「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 つのテーブルを結合してビューを作成し、統合されたデータを分析できるようにする必要があります。

4

1 に答える 1

3

エラーはあなたの問題の手がかりを与えると思います:

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

ハイブ テーブルにフィールドがありますdateが、挿入したデータのタイプはtimestampです。

テーブルを再作成します (または、置き換えたくない場合は新しいテーブルを作成します)。

CREATE EXTERNAL TABLE ext3 ( run_date timestamp )
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'=);
于 2015-04-17T12:07:26.940 に答える