溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

elasticsearch-hadoop hive導入數據怎么實現不自動分詞

發布時間:2021-12-10 09:22:20 來源:億速云 閱讀:235 作者:iii 欄目:云計算
# 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字,可根據具體需求調整示例細節或補充更多配置參數說明。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女