서로 다른 두 데이터 소스의 데이터를 결합하거나, 같은 고객이 여러 번 구매했거나, 웹 양식에 동일한 데이터를 두 번 입력하는 등, 누구나 한 번쯤은 중복 데이터 문제에 직면하는 것 같습니다.

이 블로그 게시물에서는 다음을 사용하는 방법을 살펴봅니다. 조회수 를 사용하여 문서 간에 일치하는 필드를 찾고 중복되지 않는 문서를 유지합니다. 이 예제에서는 각 문서에 다음과 같은 세 가지 공통 사용자 지정 필드가 있다고 가정합니다. first_name, last_name, 우편_코드. 를 사용하여 루비 클라이언트 의 경우 카우치베이스 서버 및 faker 루비 젬을 사용하면 간단한 데이터 생성기 를 사용하여 일부 샘플 중복 데이터를 Couchbase에 로드합니다. Couchbase에서 Ruby를 프로그래밍 언어로 사용하려면 Ruby SDK를 다운로드해야 합니다. 여기.

 

실행 샘플은 다음과 같습니다:

 

$ 루비 ./generate.rb -help

사용법: generate.rb [옵션]
   -h, -호스트네임 호스트네임           연결할 호스트 이름(기본값: 127.0.0.1:8091)
   -u, -사용자 사용자 이름               로그인할 사용자 아이디(기본값: 없음)
   -p, -passwd 비밀번호            로그인할 비밀번호(기본값: 없음)
   -b, -버킷 이름                 연결할 버킷의 이름(기본값: 기본값)
   -t, -총-기록 NUM           생성할 레코드의 총 개수(기본값: 10000)
   -d, -중복 비율 NUM          각 NUM 번째 레코드는 중복됩니다(기본값: 30).
   -?, -help                        이 메시지 표시


$ ruby ./generate.rb -t 1000 -d 5
     1000 / 1000

 

Couchbase의 각 문서에는 다음과 같이 액세스할 수 있는 사용자 지정 키가 있습니다. meta.id 를 뷰의 맵 기능에 추가합니다. 아래 그림 1에는 위의 데이터 생성기 클라이언트를 사용하여 Couchbase Server에 로드된 여러 문서가 있습니다.
 

1단계

문서 ID를 출력하는 사용자 정의 맵 함수(meta.id), 특정 중복 패턴이 일치하는 경우 모든 문서(first_name, last_name, 우편_코드 이 경우).
 

함수 (문서, 메타) {

      emit([doc.first_name + '-' + doc.last_name + '-' + doc.postal_code], meta.id);

}

지도 함수는 두 문서가 중복되는 경우를 정의합니다. 위에 정의된 지도 함수에 따르면 이름, 성, 우편번호가 일치하면 두 문서가 중복된 것입니다. 이름, 성, 우편번호를 연결할 때 데이터의 앨리어싱을 방지하기 위해 '-'를 사용합니다.

2단계

축소 기능은 다음과 같습니다.

함수 (키, 값, 재환원) {

  if (재환원) {
    var res = [];
    for (var i = 0; i < values.length; i++){
      res = res.concat(values[i])
    }
    반환합니다;
  } else {
    반환 값을 반환합니다;
  }
}
 

그룹화 후 메타아이디 값이 두 개 이상 있는 경우 이를 연결하여 중복 문서를 참조하는 메타아이디 목록을 가져옵니다.

3단계

의 핵심 부분은 데이터 클리너 는 Ruby로 작성되었습니다.
 
 
require 'couchbase'
 
연결 = 카우치베이스.연결(옵션)
ddoc = 연결.디자인_문서[옵션[:디자인_문서]]
보기 = ddoc.보내기(옵션[보기])
연결.실행 do
 보기.(그룹 => true) do |doc|
   dup_num = doc..크기
   만약 dup_num > 1
       "왼쪽 문서 #{doc.[0]}, “
      # 두 번째부터 마지막까지 문서 삭제
       연결.삭제(doc.[1..1])
       "제거됨 #{dup_num} 중복"
   
 
 
카우치베이스 서버에 연결하여 뷰를 쿼리합니다. 값 필드는 중복 문서(이름, 성 및 우편 번호가 일치하는)에 해당하는 메타 ID의 배열입니다. 배열 크기가 1보다 크면 마지막 메타 ID에 해당하는 문서를 제외한 모든 문서가 삭제됩니다.

값 배열에 있는 메타 아이디의 수가 2보다 크면 해당 키에 해당하는 문서가 중복된 것입니다. 위 그림에서 보듯이 id19와 id20은 중복 문서입니다.

데이터 클리너 스크립트의 출력은 다음과 같습니다.
 
아래 그림과 같이 이제 중복 문서가 제거됩니다.
즐기세요!
루비 코드를 작성해준 세르게이에게 감사드립니다.

작성자

게시자 돈 핀토, 수석 제품 관리자, Couchbase

돈 핀토는 Couchbase의 수석 제품 관리자로 현재 Couchbase Server의 기능을 발전시키는 데 주력하고 있습니다. 데이터 기술에 대한 열정이 대단한 그는 과거에 기술 블로그와 백서 등 Couchbase Server에 관한 여러 기사를 저술한 바 있습니다. Couchbase에 입사하기 전에는 IBM에서 수년간 근무하며 DB2 정보 관리 그룹에서 소프트웨어 개발자의 역할을 수행했고, 가장 최근에는 Microsoft의 SQL Server 팀에서 프로그램 관리자로 근무했습니다. Don은 캐나다 토론토 대학교에서 컴퓨터 공학 석사 학위와 컴퓨터 공학 학사 학위를 받았습니다.

댓글 하나

  1. "너무 큰 감소" 오류가 발생합니다.

    1. 축소 코드 청크를 제거하면 오류가 사라집니다. 하지만 그 축소 코드가 필요한 것 같아요...

  2. N1QL에서 이 작업을 수행할 수 있나요? 클라이언트에서 하는 것이 더 빠를 것입니다.

    1. 매트 인젠트론 9월 2, 2016에서 5:18 오전

      예, 4.0 이상에서는 N1QL을 사용하여 비슷한 작업을 수행할 수 있습니다. 이 블로그는 원래 2.0용으로 작성되었습니다. 즉, Couchbase는 분산 시스템으로 배포되므로 N1QL 프로시저를 실행하면 클라이언트와 동일하게 작동합니다. 실제로는 기초 데이터에 대한 클라이언트입니다. 경우에 따라 데이터와 함께 쿼리 서비스를 실행하면 이점을 얻을 수 있지만, 다른 프로그램에서도 충분히 그렇게 할 수 있습니다.

댓글 남기기