HBase 쿼리 예제: put(), get() 및 scan() 명령어
⚡ 스마트 요약
HBase의 put, get, scan은 데이터를 쓰고 읽는 핵심 명령어로, 이를 통해 행과 열별로 셀 값을 저장하거나, 단일 행을 가져오거나, 셸에서 여러 행을 탐색할 수 있습니다. Java API.
HBase 테이블에 데이터 쓰기: 셸
이 예제들은 HBase가 다음과 같다고 가정합니다. 설치 및 실행 중HBase 셸이 열려 있고, guru99라는 이름의 테이블 이미 컬럼 패밀리 교육 및 프로젝트가 존재합니다.
`put` 명령어는 데이터를 테이블에 저장하는 데 사용됩니다.
Syntax: put <'tablename'>,<'rowname'>,<'columnvalue'>,<'value'>
이 명령어는 다음과 같은 용도로 사용됩니다.
- 정의되거나 지정된 테이블이나 행 또는 열에 셀 '값'을 입력합니다.
- 선택적으로 타임스탬프를 연동할 수 있습니다.
예를 들어, 여기서는 "guru99" 테이블의 r1행 c1열에 값을 입력합니다.
hbase> put 'guru99', 'r1', 'c1', 'value', 10
아래 스크린샷에서 볼 수 있듯이, “guru99” 테이블에 10, 15, 30이라는 세 가지 값을 입력했습니다.
테이블 "guru99"에 g와 같은 테이블 참조가 있다고 가정해 보겠습니다. 다음과 같이 테이블 참조에 대해 명령을 실행할 수도 있습니다.
hbase> g.put 'guru99', 'r1', 'c1', 'value', 10
"guru99"에 값을 입력하면 위 스크린샷과 같은 결과가 나타납니다.
HBase 테이블에서 데이터 읽기: 셸
이 섹션에서는 다음 사항을 확인합니다. HBase 셸:
- HBase 테이블 "guru99"에 삽입되는 값입니다.
- HBase 테이블 guru99에 있는 열 이름과 해당 값입니다.
아래 스캔 출력은 "guru99"에 삽입된 모든 값과 해당 행 및 열 이름을 나열합니다.
위 스크린샷을 통해 다음과 같은 사실을 추론할 수 있습니다.
- HBase 셸에서 "scan" 명령을 실행하면 "guru99"에 삽입된 값이 다음과 같이 표시됩니다.
- HBase 셸에서는 우리 코드가 삽입한 값과 열 및 행 이름이 표시됩니다.
- 여기서 삽입된 열 이름은 "교육"과 "프로젝트"임을 확인할 수 있습니다.
- 해당 열에 삽입된 값은 "BigData"와 "HBase Tutorials"입니다.
get 명령어를 사용하여 테이블에서 데이터를 읽을 수도 있습니다.
Syntax: get <'tablename'>, <'rowname'>, {< Additional parameters>}
여기서 추가 매개변수에는 TIMERANGE, TIMESTAMP, VERSIONS 및 FILTERS가 포함됩니다. 이 명령을 사용하면 테이블에서 특정 행 또는 셀의 내용을 가져올 수 있습니다. TIMESTAMP, TIMERANGE, VERSIONS 또는 FILTERS와 같은 추가 매개변수를 사용하여 특정 행 또는 셀의 내용을 가져올 수 있습니다. 아래 표는 이러한 매개변수를 요약한 것입니다.
| 매개 변수 | 목적 |
|---|---|
| 시간 범위 | 시작 시간과 종료 시간 사이에 타임스탬프가 있는 셀을 반환합니다. |
| 타임 스탬프 | 특정 시점에 저장된 셀 버전만 반환합니다. |
| 버전 | 셀의 버전을 몇 개 반환할지 설정합니다(기본값은 1). |
| 필터 | 반환될 행 또는 열을 제한하기 위해 필터를 적용합니다. |
| 기둥 | 결과를 특정 컬럼 패밀리 또는 한정자로 제한합니다. |
다음은 get 명령어의 사용 예시입니다.
hbase> get 'guru99', 'r1', {COLUMN => 'c1'}
아래 스크린샷과 같이 이 명령어를 사용하면 "guru99" 테이블의 r1행과 c1열 값이 표시됩니다.
hbase> get 'guru99', 'r1'
이 명령어를 사용하면 "guru99" 테이블의 r1 행 값이 표시됩니다.
hbase> get 'guru99', 'r1', {TIMERANGE => [ts1, ts2]}
이 명령어를 사용하면 "guru99" 테이블의 r1 행 값 중 시간 범위 ts1부터 ts2까지의 값이 표시됩니다.
hbase> get 'guru99', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
이 명령을 사용하면 "guru99" 테이블의 r1 행과 c1, c2, c3 열 패밀리의 값이 표시됩니다.
HBase 테이블에 데이터 쓰기: JAVA API
이 단계에서는 HBase 테이블 "guru99"에 데이터를 기록할 것입니다.
먼저, HBaseLoading.java 프로그램을 사용하여 HBase에서 값을 삽입하고 검색하는 코드를 작성해야 합니다. 열 수준에서 테이블을 생성하고 값을 삽입하는 코드는 아래와 같습니다.
아래 스크린샷은 다음을 보여줍니다. Java HBase 구성을 생성하고 "guru99"에 값을 삽입하는 코드:
위 스크린샷에서:
- HBase 구성을 생성할 때, HBase 설치 중에 hbase-site.xml 및 hbase-default.xml 파일에 설정한 구성을 참조하게 됩니다.
- HTable 방식을 사용하여 "guru99" 테이블을 생성합니다.
- "guru99" 테이블에 1행을 추가합니다.
- "교육"과 "프로젝트"라는 열 이름을 지정하고 해당 열에 값을 삽입합니다(1행). 여기에 삽입된 값은 다음과 같습니다. BigData 그리고 “HBaseTutorials”.
HBase 테이블에서 데이터 읽기: Java API
위 섹션에서 HBase 테이블에 입력한 값이 무엇이든, 여기서는 해당 값을 가져와 표시할 것입니다.
아래 콘솔 출력은 HBase 테이블 "guru99"에서 읽어온 데이터를 보여줍니다.
“guru99”에 저장된 결과를 검색하려면 다음 단계를 따르세요.
- 여기서는 "교육"과 "프로젝트"라는 컬럼 패밀리에 저장된 값을 가져올 것입니다.
- "get" 명령어를 사용하여 HBase 테이블에 저장된 값을 가져오겠습니다.
- "scan" 명령어를 사용한 스캔 결과입니다. row1에 저장된 값이 콘솔에 표시됩니다.
코드를 작성한 후에는 실행합니다. Java 신청 이렇게 :
HBaseLoading.java를 마우스 오른쪽 버튼으로 클릭하고 '다른 이름으로 실행'을 선택합니다. Java 신청.
“HBaseLoading.java”를 실행하면 값이 HBase의 각 열에 있는 “guru99” 변수에 삽입되고, 동일한 프로그램에서 값을 검색할 수도 있습니다.
전체 코드는 다음과 같습니다.
import java.io.IOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class HBaseLoading { public static void main(String[] args) throws IOException { /* When you create a HBaseConfiguration, it reads in whatever you've set into your hbase-site.xml and in hbase-default.xml, as long as these can be found on the CLASSPATH*/ org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create(); /*This instantiates an HTable object that connects you to the "test" table*/ HTable table = new HTable(config, "guru99"); /* To add to a row, use Put. A Put constructor takes the name of the row you want to insert into as a byte array.*/ Put p = new Put(Bytes.toBytes("row1")); /*To set the value you'd like to update in the row 'row1', specify the column family, column qualifier, and value of the table cell you'd like to update. The column family must already exist in your table schema. The qualifier can be anything.*/ p.add(Bytes.toBytes("education"), Bytes.toBytes("col1"),Bytes.toBytes("BigData")); p.add(Bytes.toBytes("projects"),Bytes.toBytes("col2"),Bytes.toBytes("HBaseTutorials")); // Once you've adorned your Put instance with all the updates you want to make, to commit it do the following table.put(p); // Now, to retrieve the data we just wrote. Get g = new Get(Bytes.toBytes("row1")); Result r = table.get(g); byte [] value = r.getValue(Bytes.toBytes("education"),Bytes.toBytes("col1")); byte [] value1 = r.getValue(Bytes.toBytes("projects"),Bytes.toBytes("col2")); String valueStr = Bytes.toString(value); String valueStr1 = Bytes.toString(value1); System.out.println("GET: " +"education: "+ valueStr+"projects: "+valueStr1); Scan s = new Scan(); s.addColumn(Bytes.toBytes("education"), Bytes.toBytes("col1")); s.addColumn(Bytes.toBytes("projects"), Bytes.toBytes("col2")); ResultScanner scanner = table.getScanner(s); try { for (Result rr = scanner.next(); rr != null; rr = scanner.next()) { System.out.println("Found row : " + rr); } } finally { // Make sure you close your scanners when you are done! scanner.close(); } } }
API 버전에 대한 참고 사항: 위 예제는 HTable 클래스와 해당 add() 메서드를 사용하는데, 이는 이전 HBase 클라이언트 API를 반영합니다. HTable은 HBase 1.0부터 더 이상 사용되지 않습니다. 최신 코드에서는 ConnectionFactory.createConnection(…).getTable(…)을 통해 테이블을 가져오고 add() 대신 addColumn()을 사용하여 Put 요청을 생성합니다. Put, Get, Scan의 로직은 동일하게 유지됩니다.






