Hive 표 증 량 을 elasticsearch 방안 으로 업데이트

5106 단어 Hiveshell
목차
1. 배경
2. 전체적인 사고방식
3. sql
       (1) 증분 삭 제 된 데이터
(2) 증 량 증가 데이터
 
4. elasticsearch 디자인
 
1. 배경
     hive 표 에는 대량의 업무 데이터 가 있 고 데이터 의 양 이 수천 만 억 이상 증가 하 며 업무 데 이 터 는 매일 일부 데이터 에 변화 가 생 길 것 이다.매일 elasticsearch 로 업데이트 되면 es 클 러 스 터 노드 의 jvm 압력 이 크 고 es 클 러 스 터 의 가용성 에 영향 을 줄 수 있 습 니 다.따라서 데 이 터 를 증분 업데이트 하여 es 군집 압력 을 낮 춰 야 합 니 다.
2. 전체적인 사고방식
     우선, 메 인 키 를 정의 해 야 합 니 다. 내용 이 변 할 때 대응 하 는 메 인 키 도 변화 가 생 깁 니 다. 데이터 가 변 하지 않 았 을 때 메 인 키 는 변 하지 않 습 니 다.(메 인 키 는 md5 를 통 해 유일한 메 인 키 를 생산 할 수 있다).sql 의 가감 법 (left, right join) 을 통 해 매일 증분 삭제 와 증분 증가 가 필요 한 데 이 터 를 찾 습 니 다.그 다음 에 es 에 동기 화 할 때 필드 를 추가 로 추가 합 니 다 (현재 증가 하 는 것 은 is valid 필드 입 니 다. 아래 sql, is valid = 0 은 무효 데 이 터 를 표시 하고 is valid = 1 은 유효 데 이 터 를 표시 합 니 다). 이 필드 는 표지 위치 이 고 표지 가 es 에 동기 화 된 데 이 터 는 업무 수행 이 가능 한 지 여부 입 니 다. 
3. sql
 (1) 증분 삭 제 된 데이터
#!/bin/sh
version_now=$(date -d"-2 day" +%Y-%m-%d)
version_pre=$(date -d"-3 day" +%Y-%m-%d)

hive -e "DROP TABLE IF EXISTS app.tmp_xz_jimi3_sku_description_delete"

hive -e "

CREATE TABLE app.tmp_xz_jimi3_sku_description_delete AS
SELECT
	main_id,
	item_sku,
	item_main_sku,
	a.bot_id,
	vender_id,
	category3,
	category3_id,
	entity_type,
	entity_value,
	entity_source,
	brand_code,
	brand_en,
	is_valid,
	version
FROM
	(
		SELECT
			tmp_pre.main_id,
			item_sku,
			item_main_sku,
			bot_id,
			vender_id,
			category3,
			category3_id,
			entity_type,
			entity_value,
			entity_source,
			brand_code,
			brand_en,
			is_valid,
			'${version_now}' AS version
		FROM
			(
				SELECT
					main_id,
					item_sku,
					item_main_sku,
					bot_id,
					vender_id,
					category3,
					category3_id,
					entity_type,
					entity_value,
					entity_source,
					brand_code,
					brand_en,
					0 AS is_valid
				FROM
					app.sku_description_corpus
				WHERE
					dt = '${version_pre}'
			)
			tmp_pre
		LEFT JOIN
			(
				SELECT main_id FROM app.sku_description_corpus WHERE dt = '${version_now}'
			)
			tmp_now
		ON
			tmp_now.main_id = tmp_pre.main_id
		WHERE
			tmp_now.main_id IS NULL
	)
	a

"

 
 (2) 증 량 증가 데이터
#!/bin/sh
version_now=$(date -d"-2 day" +%Y-%m-%d)
version_pre=$(date -d"-3 day" +%Y-%m-%d)

hive -e "DROP TABLE IF EXISTS app.tmp_xz_jimi3_sku_description_add"
hive -e "
 
CREATE TABLE app.tmp_xz_jimi3_sku_description_add AS
SELECT
	tmp_now.main_id,
	item_sku,
	item_main_sku,
	bot_id,
	vender_id,
	category3,
	category3_id,
	entity_type,
	entity_value,
	entity_source,
	brand_code,
	brand_en,
	is_valid,
	'${version_now}' as version
FROM
	(
		SELECT
			main_id,
			item_sku,
			item_main_sku,
			bot_id,
			vender_id,
			category3,
			category3_id,
			entity_type,
			entity_value,
			entity_source,
			brand_code,
			brand_en ,
			1 AS is_valid
		FROM
			app.sku_description_corpus
		WHERE
			dt = '${version_now}'
	)
	tmp_now
LEFT JOIN
	(
		SELECT main_id FROM app.sku_description_corpus WHERE dt = '${version_pre}'
	)
	tmp_pre
ON
	tmp_now.main_id = tmp_pre.main_id
WHERE
	tmp_pre.main_id IS NULL
"

 
4. elasticsearch 디자인
     es 의 색인 디자인 은 다음 과 같 습 니 다. hiv 표 의 데 이 터 를 es 에 삽입 할 때 hiv 표 의 mainid 는 es 의id 이렇게 같은 mainid 는 es 에서 하나의 데이터 만 있 으 면 됩 니 다.데 이 터 를 삭제 해 야 할 때 t - 1 을 비교 할 때 삭제 해 야 할 데이터 mainid 는 같 습 니 다. 이 럴 때 es 에 동기 화하 면 t - 1 시의 데 이 터 를 덮어 쓸 수 있 습 니 다.
{
  "settings": {
    "index": {
      "number_of_shards": "8",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "xz_jimi3_sku_describe_info": {
      "dynamic": "false",
      "_all": {
        "enabled": false
      },
      "properties": {
        "id": {
          "type": "keyword"
        },
        "itemSku": {
          "type": "keyword"
        },
        "itemMainSku": {
          "type": "keyword"
        },
        "botId": {
          "type": "keyword"
        },
        "venderId": {
          "type": "keyword"
        },
        "cate3Id": {
          "type": "keyword"
        },
        "cate3Name": {
          "type": "keyword"
        },
        "entityType": {
          "type": "keyword"
        },
        "entityValue": {
          "type": "text",
          "analyzer": "whitespace"
        },
        "entitySource": {
          "type": "keyword"
        },
        "brandEn": {
          "type": "keyword"
        },
        "brandId": {
          "type": "keyword"
        },
        "valid": {
          "type": "keyword"
        },
        "dt": {
          "type": "keyword"
        }
      }
    }
  }
}

 
 

좋은 웹페이지 즐겨찾기