ES往HIVE倒数据遇到时间格式问题

在项目中,尝试将Elasticsearch中的数据导入HIVE时遇到时间格式问题导致异常。通过深入研究Elasticsearch-hadoop的源码,发现在HiveValueReader中时间字符串的解析方式可能是问题所在。

项目中遇到ES中的时间格式导入HIVE中,出现异常。

今天晚上有空研究了一下Elasticsearch-hadoop 源码,发现HiveValueReader用的是下面这个方法在解析时间字符串

DatatypeConverter.parseDateTime(value)

没有用到ES中我们指定的时间格式。

curl -XPUT 'localhost:9200/myindex?pretty' -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "myindex": { 
      "_all":       { "enabled": false  }, 
      "properties": { 

        "id":  {
          "type":   "keyword" 
        },
        "created":  {
          "type":   "date", 
          "format": "yyyyMMddHHmmssSSS||epoch_millis"
        }
      }
    }
  }
}
'

解决方法:
在HIVE中指定时间格式,并自定义自己的reader.  这里的时间格式是自定义个属性。
CREATE EXTERNAL TABLE myindex (id  STRING, created timestamp )
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('
### ElasticsearchHive 的集成 Elasticsearch 可以通过 `elasticsearch-hadoop` 组件与 Hive 进行深度集成,实现数据在 Hive 表和 Elasticsearch 之间的双向读写。这种集成方式使得用户可以利用 Hive 的 SQL 查询能力对 Elasticsearch 中的数据进行分析,并支持将数据持久化到 HDFS 生态中 [^2]。 #### 数据从 Hive 写入 Elasticsearch 使用 `elasticsearch-hadoop` 提供的 Hive 集成功能,可以通过创建外部表的方式将 Hive 表映射到 Elasticsearch 索引。以下是一个典型的 HiveQL 示例: ```sql CREATE EXTERNAL TABLE es_hive_table ( id STRING, name STRING, age INT ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' LOCATION '/user/hive/es_data' TBLPROPERTIES( 'es.resource' = 'my_index/my_type', 'es.nodes' = 'localhost:9200', 'es.input.json' = 'true' ); ``` 在此配置下,向 `es_hive_table` 插入数据会自动将记录同步到 Elasticsearch 的 `my_index` 索引中 [^1]。 #### 从 Elasticsearch 查询数据并通过 Hive 分析 除了写入操作,Hive 也可以作为查询引擎,直接从 Elasticsearch 中读取数据。通过类似的外部表定义方式,Hive 可以透明地访问 Elasticsearch 数据并执行 SQL 查询: ```sql SELECT * FROM es_hive_table WHERE age > 30; ``` 该查询会由 Hive 转换为 Elasticsearch 的 DSL 查询语句,并返回匹配的结果集 [^2]。 #### 字段映射与类型转换 由于 HiveElasticsearch 的数据模型存在差异,字段映射是集成过程中的关键环节。例如,Elasticsearch 中的 `date` 类型字段需要在 Hive 表中对应为 `STRING` 或 `TIMESTAMP` 类型,并确保数据格式一致。此外,嵌套对象(`nested`)或地理位置(`geo_point`)等复杂类型也需要特殊处理 [^2]。 #### 常见问题异常处理 在实际部署过程中,可能会遇到通信异常,例如 HiveServer2 在查询 Elasticsearch 映射表时抛出 `SocketException`。这类问题通常与网络配置、Thrift 服务状态或 `elasticsearch-hadoop` 的版本兼容性有关。建议检查 HiveHadoop 集群的配置,并参考官方文档进行调优 [^4]。 #### 跨数据源查询的限制与替代方案 虽然 Presto 支持分别查询 HiveElasticsearch,但它不支持跨数据源的 JOIN 操作。因此,一种常见的解决方案是先将 Elasticsearch 数据导入 Hive,再进行关联查询。这可以通过 `elasticsearch-hadoop` 的批量导入功能实现 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值