elasticsearch-hadoop hive导入数据怎么实现不自动分词

发布时间:2021-12-10 09:22:20 作者:iii
来源:亿速云 阅读:232
# Elasticsearch-Hadoop Hive导入数据怎么实现不自动分词

## 一、背景与问题概述

在大数据生态系统中,Elasticsearch与Hadoop的集成(通过elasticsearch-hadoop工具包)为数据分析和检索提供了强大支持。当我们需要将Hive表中的数据导入Elasticsearch时,默认情况下字符串类型字段会被自动分词,这在某些场景下会产生不符合预期的结果。

### 1.1 典型场景示例
假设我们有一个Hive表存储产品信息:
```sql
CREATE TABLE products (
  product_id STRING,
  product_name STRING,
  description STRING,
  price DOUBLE
);

当使用elasticsearch-hadoop将该表数据导入Elasticsearch时,product_name字段默认会被分词。例如: - 原始值:”Apple iPhone 13 Pro” - 存储为:[“apple”, “iphone”, “13”, “pro”]

这种分词行为对于精确匹配查询(如产品名称、ID等)会造成困扰。

1.2 核心问题

如何在使用elasticsearch-hadoop从Hive导入数据到Elasticsearch时,控制字段的分词行为,特别是禁止某些字段的自动分词?

二、技术原理分析

2.1 Elasticsearch的mapping机制

Elasticsearch通过mapping定义索引中字段的存储和索引方式。控制分词的关键属性包括: - type:字段数据类型 - index:是否索引(analyzed/not_analyzed) - analyzer:指定分词器

在ES 5.x+版本中,字符串字段主要分为两种:

{
  "product_name": {
    "type": "text",   // 默认分词
    "fields": {
      "keyword": {
        "type": "keyword"  // 不分词
      }
    }
  }
}

2.2 elasticsearch-hadoop的工作机制

elasticsearch-hadoop在数据写入时会自动创建索引并推断mapping。其行为受以下因素影响: 1. Hive表结构(字段类型) 2. 用户指定的配置参数 3. Elasticsearch的自动mapping检测

三、解决方案详解

3.1 方案一:通过mapping模板预定义

步骤1:创建Elasticsearch索引模板

PUT _template/hive_data_template
{
  "index_patterns": ["hive_data_*"],
  "mappings": {
    "properties": {
      "product_name": {
        "type": "keyword"  // 强制定义为keyword类型
      },
      "product_id": {
        "type": "keyword"
      }
    }
  }
}

步骤2:Hive中执行导出

SET es.mapping.id=product_id;
SET es.resource=products_index/products_type;
SET es.index.auto.create=true;

INSERT OVERWRITE TABLE es_table 
SELECT * FROM products;

关键参数说明: - es.mapping.id:指定文档ID字段 - es.resource:目标索引/类型 - es.index.auto.create:允许自动创建索引

3.2 方案二:通过配置指定字段类型

在HQL中直接指定字段映射:

SET es.mapping.types=product_id:keyword,product_name:keyword;
SET es.mapping.include=product_id,product_name,description,price;

INSERT OVERWRITE TABLE es_table
SELECT * FROM products;

参数说明: - es.mapping.types:显式定义字段类型 - es.mapping.include:指定要导出的字段

3.3 方案三:使用动态模板(Dynamic Templates)

适用于需要灵活控制大量字段的场景:

PUT _template/hive_dynamic_template
{
  "index_patterns": ["dynamic_*"],
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "match": "*_noanalyze",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

然后在Hive表中将需要不分词的字段重命名(添加_noanalyze后缀)。

四、实战案例演示

4.1 完整示例流程

步骤1:准备Hive表数据

CREATE TABLE user_actions (
  log_id STRING,
  user_id STRING,
  action_time TIMESTAMP,
  page_url STRING,
  search_query STRING
);

-- 插入测试数据
INSERT INTO user_actions VALUES
('log001', 'user123', '2023-01-01 10:00:00', '/products/phone', 'iphone 13 pro max'),
('log002', 'user456', '2023-01-01 10:05:00', '/cart', NULL);

步骤2:配置Elasticsearch连接

-- 设置ES集群地址
SET es.nodes=es-cluster:9200;
SET es.resource=user_actions_log/doc;
SET es.mapping.id=log_id;
SET es.mapping.types=log_id:keyword,user_id:keyword,page_url:keyword;

步骤3:执行数据导出

INSERT OVERWRITE TABLE es_table 
SELECT * FROM user_actions;

步骤4:验证结果

# 查看生成的mapping
GET user_actions_log/_mapping

# 查询验证分词情况
POST user_actions_log/_search
{
  "query": {
    "term": {
      "page_url": "/products/phone"
    }
  }
}

4.2 常见问题排查

问题1:字段仍然被分词 - 检查模板是否匹配索引名称 - 确认配置参数拼写正确 - 检查Elasticsearch版本兼容性

问题2:类型转换错误

-- 对于非字符串字段需要显式转换
SET es.mapping.types=price:double,is_active:boolean;

五、高级配置技巧

5.1 多级字段控制

对于嵌套文档,可以使用JSON路径指定:

SET es.mapping.types=address.city:keyword,address.zipcode:keyword;

5.2 自定义空值处理

SET es.input.json=false;
SET es.mapping.null_value.empty_string="NULL";

5.3 批量操作优化

SET es.batch.size.entries=1000;
SET es.batch.size.bytes=5mb;
SET es.batch.write.refresh=false;

六、性能考量与最佳实践

  1. 索引设计原则

    • 对需要精确匹配的字段使用keyword
    • 对需要全文检索的字段保留text类型
    • 合理设置index属性
  2. 资源管理

    SET es.http.timeout=5m;
    SET es.scroll.size=5000;
    
  3. 监控建议

    • 关注ES的bulk队列情况
    • 监控Hive任务的GC情况
    • 使用_bulkAPI的响应时间作为健康指标

七、版本兼容性说明

ES-Hadoop版本 支持特性
6.x 完整的keyword/text支持
5.x 基本支持,需注意类型声明
7.x+ 移除type概念,需调整resource格式

对于ES 7+版本,resource应简化为:

SET es.resource=products_index;

八、总结

通过合理组合Elasticsearch的mapping模板和elasticsearch-hadoop的配置参数,我们可以精确控制从Hive导入数据时的分词行为。关键点包括: 1. 预先定义索引模板或mapping 2. 正确使用es.mapping.types参数 3. 理解不同版本间的行为差异 4. 在生产环境前充分验证mapping效果

附录: - Elasticsearch-Hadoop官方文档 - Elasticsearch Mapping参数详解 “`

注:本文档实际字数约3100字,可根据具体需求调整示例细节或补充更多配置参数说明。

推荐阅读:
  1. ES学习笔记-elasticsearch-hadoop导入hive数据到es的实现探究
  2. Elasticsearch.Net如何实现MVC4图书管理系统

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

elasticsearch hadoop hive

上一篇:树莓派4B上怎样安装VSCode

下一篇:jdk安装以及版本问题怎么解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》