이 블로그에서는 HBase의 개념 증명 샘플에 대해 설명합니다.
여기에 아래 이미지와 같은 데이터 세트가 있습니다.
이 데이터 세트는 총 수신 통화, 발신 통화 및 특정 날짜에 특정 휴대폰 번호에서 보낸 메시지에 대한 세부 정보로 구성됩니다.
첫 번째 필드는 날짜, 두 번째 필드는 휴대폰 번호, 세 번째 필드는 총 수신 통화 시간, 네 번째 필드는 총 발신 통화 시간, 다섯 번째 필드는 총 메시지 전송 수를 나타냅니다.
이제 우리의 임무는 특정 날짜의 전화 번호에서 수신 및 발신 전화 및 메시지 전송 기간에 대한 정보를 검색하는 것입니다.
이 사용 사례에서는 15 개의 레코드를 필터링하려고합니다.일이를 달성하기위한 HBase 프로그램이 있습니다.
아래는 완전한 코드입니다.
공공의 수업 견본{
은밀한 공전 구성 conf
공전 HTable 표
공공의 sample (문자열 tableName, 문자열 colFams) 던지다 IOException {
conf = HBaseConfiguration. 창조하다 ()
createTable (tableName, colFams)
표 = 새로운 HTable ( conf , tableName)
}
빈 createTable (문자열 tableName, 문자열 colFams) 던지다 IOException {
HBaseAdmin hbase = 새로운 HBaseAdmin ( conf )
HTableDescriptor desc = 새로운 HTableDescriptor (tableName)
HColumnDescriptor 메타 = 새로운 HColumnDescriptor (colFams.getBytes ())
desc.addFamily (메타)
hbase.createTable (desc)
}
공공의 공전 빈 addColumnEntry (문자열 tableName, 문자열 행,
문자열 colFamilyName, 문자열 colName, 문자열 값)
던지다 IOException {
바이트 [] rowKey = 바이트. toBytes (열)
putdata = 새로운 Put (rowKey)
putdata.add (바이트. toBytes (colFamilyName), 바이트. toBytes (colName),
바이트. toBytes (값))
표 .put (putdata)
}
공공의 공전 빈 getAllRecord (문자열 tableName, 문자열 startPartialKey,
문자열 endPartialKey) 던지다 IOException {
시험 {
자바의 해시 세트는 무엇입니까
스캔 s
만약 (startPartialKey == 없는 || endPartialKey == 없는 )
s = 새로운 주사()
그밖에
s = 새로운 스캔 (바이트. toBytes (startPartialKey),
바이트. toBytes (endPartialKey))
ResultScanner ss = 표 .getScanner (s)
HashMap
문자열 imsi =“”
...에 대한 (결과 r : ss) {
HashMap keyVal = 새로운 HashMap ()
...에 대한 (KeyValue kv : r.raw ()) {
imsi = 새로운 문자열 (kv.getRow ()). substring (10)
keyVal.put ( 새로운 문자열 (kv.getQualifier ()),
기계 학습을 배우기위한 전제 조건
새로운 문자열 (kv.getValue ()))
outputRec.put (imsi, keyVal)
만약 (keyVal.size () == 3)
체계. 밖 .println (take +””+“Incoming minutes :”
+ keyVal.get (“c1 ″) +”예정 시간 :”
+ keyVal.get (“c2 ″) +”메시지 :”
+ keyVal.get ( 'c3'))
}
}
} 드디어 {
}
}
공공의 공전 빈 main (문자열 [] 인수) 던지다 IOException {
문자열 tableName = 'daterecords'
문자열 colFamilyNames =“i”
샘플 테스트 = 새로운 sample (tableName, colFamilyNames)
문자열 fileName =“/ home / cloudera / Desktop / data”
// 한 번에 한 줄을 참조합니다.
문자열 줄 = 없는
시험 {
// FileReader는 기본 인코딩으로 텍스트 파일을 읽습니다.
FileReader fileReader = 새로운 FileReader (파일 이름)
// 항상 BufferedReader에 FileReader를 래핑합니다.
BufferedReader bufferedReader = 새로운 BufferedReader (fileReader)
동안 ((라인 = bufferedReader.readLine ())! = 없는 ) {
String [] values = line.split ( '')
addColumnEntry (tableName, values [0] + '-'+ values [1],
colFamilyNames, 'c1', 값 [2])
addColumnEntry (tableName, values [0] + '-'+ values [1],
colFamilyNames, 'c2', 값 [3])
addColumnEntry (tableName, values [0] + '-'+ values [1],
colFamilyNames, 'c3', 값 [4])
}
bufferedReader.close ()
} 잡기 (FileNotFoundException 예) {
체계. 밖 .println (“파일‘”+ fileName +“‘”을 (를) 열 수 없습니다.)
} 잡기 (IOException 예) {
체계. 밖 .println (“파일‘”+ fileName +“‘”읽기 오류)
// 또는 다음과 같이 할 수 있습니다.
// ex.printStackTrace ()
}
getAllRecord (tableName,“20140315”,“20140316”)
}
}
여기에서는 Configuration, HTable 클래스의 개체를 만들고 이름으로 Hbase Table을 만들었습니다. 날짜 기록 및 column family : 나는 .
이 사용 사례에서는 '-'로 구분 된 날짜와 휴대폰 번호의 조합을이 Hbase 테이블의 행 키와 수신, 발신 통화 시간 ','c1 ','열로 전송 된 메시지 수로 사용합니다. 열 패밀리 'i'의 경우 c2 ','c3 '.
Cloudera의 로컬 파일 시스템에 입력 데이터가 저장되어 있습니다. 따라서 파일에서 데이터를 읽는 Java Logic을 작성해야합니다.
다음은 Java 로직입니다.
이 방법에서는 column family의 각 열에 대한 테이블에 데이터를 저장합니다.
스캔 명령어를 사용하여 Hbase 테이블 'daterecords'에 저장된 데이터를 확인할 수 있습니다.
아래 이미지와 같은 데이터를 받게됩니다.
이제 데이터를 HBase 테이블에 성공적으로 삽입했습니다.
특정 날짜의 테이블에 저장된 레코드를 검색해 보겠습니다.
이 사용 사례에서는 Date : 15의 레코드를 검색하려고합니다.일2014 년 3 월
레코드를 검색하기 위해 메서드를 만들었습니다.
getAllRecord (문자열 tableName, 문자열 startPartialKey, 문자열 endPartialKey)
첫 번째 매개 변수는 테이블 이름을 나타내고 두 번째 매개 변수는 데이터를 검색해야하는 시작 날짜를 나타내고 세 번째 매개 변수는 시작 날짜의 다음 날짜입니다.
예 :
getAllRecord (tableName,“20140315”,“20140316”)
이제 이해합시다 논리 이 방법의.
startPartialKey 및 endPartialKey의 도움으로 HBase API를 사용하여 Hbase 테이블을 스캔하려고합니다.
StartPartialKey 및 endPartialkey가 null이 아니므로 else 블록으로 이동하여 startPartialKey 값을 가진 레코드를 스캔합니다.
자바 예제에서 xml 파일 읽기
Hbase 테이블의 스캔 된 레코드를 저장하는 Result scanner 객체와 결과가 될 출력을 저장하기위한 HashMap을 만들었습니다.
결과 스캐너에서 데이터 저장소를 가져오고 for 루프를 실행하기 위해 Result 개체를 생성하고 있습니다.
imsi는 휴대폰 번호를 저장하기 위해 정의 된 문자열이고 keyVal은 특정 전화기의 열에서 검색된 출력을 저장하는 해시 맵입니다.
우리는 20140315-1234567890 로 rowkey Hbase 테이블에. 이 20140315는 날짜를 나타내고 1234567890은 휴대폰 번호를 나타냅니다.
휴대폰 번호 만 필요하므로 하위 문자열 메서드를 사용하여 검색합니다.
r.raw ()에서 데이터를 검색하고 Put을 사용하여 HashMap에 저장합니다.
마지막으로 콘솔에 인쇄하려고합니다.
출력은 아래 이미지와 같습니다.
Date : 15의 기록을 성공적으로 검색했습니다.일2014 년 3 월.