2016-08-10 1 views
1

HBase 1.x에는 전체 행을 삭제할 수있는 Table 개체에 대한 삭제 메서드가 있습니다. 그러나 행이 실제로 테이블에 있는지 여부에 관계없이 "성공"합니다 (반환 값이 없음). 행이 HBase의 Table.delete에 대한 특정 호출에 의해 삭제되었는지 확인하는 방법이 있습니까?HBase : 삭제할 전화가 실제로 행을 삭제했는지 어떻게 판단 할 수 있습니까?

checkAndDelete가 적합 할 수 있다고 생각합니다. 예를 들어 행이 먼저 있는지 확인하는 것이 좋습니다. 다음과 같은 내용 :

boolean deleted = false; 
try (Table table = getTable(TABLE_NAME)) { 
    byte[] rowKey = Bytes.toBytes(rowId); 
    deleted = table.checkAndDelete(???, new Delete(rowKey)); 
} catch (Exception e) { 
    // handle exceptions here 
} 
// here I know if the row was deleted or not 

'???'에 넣을 조건이 확실하지 않습니다. 부품. 컬럼 값 (내가 알고있는 컬럼 값)이 비어 있지는 않지만, 작동하지 않았다는 것을 확인하려고 노력했다. 같은 효과를 달성하기 위해, 내가 대신 두 통화 (다음 삭제 존재)로 checkAndDelete를 교체 했어 :

if (table.exists(new Get(rowKey))) { 
    table.delete(new Delete(rowKey)); 
    deleted = true; // row deleted 
    } 

한 원자 전화가 훨씬 좋네요 될 것이다. 확실히 다른 누군가가 이와 비슷한 일을 해왔습니다.

답변

1

HBase의 Table.delete를 호출하여 특정 행을 삭제했는지 확인하는 방법이 있습니까?

우리는 Splice Machine (오픈 소스)에서 더 높은 수준의 SQL 레이어를 사용하지만 삭제 및 삭제 (일괄 처리는 논리적 삭제 및 물리적 삭제의 일괄 삭제)를 생각하면, . checkAndPut 설명은 다음과 같습니다

...

/** 
    * Atomically checks if a row/family/qualifier value matches the expected 
    * value. If it does, it adds the put. If the passed value is null, the check 
    * is for the lack of column (ie: non-existance) 
    * 
    * @param row to check 
    * @param family column family to check 
    * @param qualifier column qualifier to check 
    * @param value the expected value 
    * @param put data to put if check succeeds 
    * @throws IOException e 
    * @return true if the new put was executed, false otherwise 
    */ 

당신은 항상 기존 기능을 무시하는 코 프로세서 호출을 크랭크 수 있습니다. 옵서버 (Observer) 또는 엔드 포인트 (Endpoint)로 할 수 있습니다.

+0

흠 ... 스캔으로 구현 된 다음 삭제 된 경우 스캔 결과가 비어있을 수 있기 때문에 행이 없으면 예외가 발생하지 않는 이유는 무엇입니까? checkAndPut 다른 장소를 사용합니다. checkAndDelete를 사용하는 아이디어에 영감을주었습니다. 내가 거기에 없었던 칼럼이 존재하지 않는지 확인해 보았을 때, 칼럼이 없었던 이유는 확실하지 않았습니다. 더미 열을 추가하고 값을 확인하지 않았습니다. (매우 해킹 된 솔루션처럼 보입니다.) 이 사용 사례 (삭제가 실제로 작동하는지 여부를 아는 것)가 매우 드뭅니다. –