Hive+经纬度+数据导入ES
### Hive与Elasticsearch中的经纬度数据处理 #### 背景介绍 在大数据处理领域,Hive(Hadoop数据库)常被用于处理结构化数据,而Elasticsearch(ES)则以其强大的全文检索功能著称。在某些应用场景中,需要将Hive中的数据导入到Elasticsearch中进行更高效的数据检索或分析。本篇主要探讨如何解决在这一过程中遇到的关于地理坐标(经纬度)数据格式不匹配的问题。 #### 问题描述 在将Hive中的数据导入到Elasticsearch时,如果Hive表中存在一个表示地理坐标的字段(如`location`),且该字段的类型为`array<double>`,那么直接导入到Elasticsearch后可能会导致该坐标数据无法正常被识别和使用。具体表现为,在Elasticsearch中该坐标字段的类型为`geo_point`,但是其值却不符合`geo_point`字段的期望格式(即一个包含`lat`和`lon`属性的JSON对象),从而导致坐标数据无法正常使用。 #### 解决方案 为了解决这个问题,可以通过以下步骤来转换和导入数据: ##### 步骤1:在Hive中创建映射表 在Hive中创建一个新的表(映射表),该表专门用于存储将要导入到Elasticsearch中的数据。这里我们创建了一个名为`es_mapping.app_enterprise_business_tags_es1222`的外部表,其中包含了与Elasticsearch对应的字段类型。 ```sql CREATE EXTERNAL TABLE `es_mapping.app_enterprise_business_tags_es1222`( `id` string COMMENT '对应es中id', `pid` string COMMENT '主键', `location` map<string,double> COMMENT '经纬度坐标' ) ROW FORMAT SERDE 'org.elasticsearch.hadoop.hive.EsSerDe' STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' WITH SERDEPROPERTIES ( 'serialization.format'='1' ) LOCATION 'hdfs://nameservice1/user/hive/warehouse/es_mapping/app_enterprise_business_tags_es1222' TBLPROPERTIES ( 'bucketing_version'='2', 'es.batch.write.retry.count'='6', 'es.batch.write.retry.wait'='60s', 'es.index.auto.create'='TRUE', 'es.index.number_of_replicas'='0', 'es.index.refresh_interval'='-1', 'es.mapping.names'='id:id,pid:pid,location:location', 'es.mapping.id'='pid', 'es.write.operation'='upsert', 'es.nodes'='http://192.168.****:9200', 'es.nodes.wan.only'='TRUE', 'es.net.http.auth.user' = 'elastic', 'es.net.http.auth.pass' = '****', 'es.resource'='company_v5' ); ``` 此表定义了`id`、`pid`以及`location`三个字段,其中`location`字段为`map<string,double>`类型,这将用于后续的转换操作。 ##### 步骤2:转换并插入数据 接下来,需要将原始Hive表中的数据进行转换,确保经纬度数据符合Elasticsearch的格式要求。具体转换逻辑如下: - 从原始表中选择需要的数据。 - 然后,通过`CASE`语句判断`location`字段是否为空。 - 如果非空,则使用`map`函数构建一个新的`location`字段,其中`lat`对应原数组中的第二个元素(索引为1),`lon`对应第一个元素(索引为0)。 - 将转换后的数据插入到之前创建的映射表中。 ```sql insert overwrite table es_mapping.app_enterprise_business_tags_es1222 select a.id, a.pid, (case when a.location is null then null else map('lat', a.location[1], 'lon', a.location[0]) end) as location from (select id, pid, location, ... -- 其他字段省略 from dw.app_enterprise_es where dt=default.maxPart('dw', 'app_enterprise_es')) a left join (select pid, booth_type, booth_area, latest_journal_sd, lates -- 其他字段省略 from some_other_table) b on a.pid = b.pid; ``` #### 总结 通过以上步骤,可以有效地解决Hive与Elasticsearch之间的数据格式不匹配问题,特别是在处理地理坐标数据时。这种方式不仅能够确保数据的准确性,还能提高数据处理的效率。此外,这种方法还可以扩展应用于其他类似的数据迁移场景中,为数据的跨系统传输提供了可靠的解决方案。