HBase 에서 중국어 처리

11183 단어 HBase
1.HBase 버 전 hbase-0.20.5,Hadoop 버 전 hadoop-0.20.2,JDK 1.6
2.HBase 에 표를 만 들 었 습 니 다.컨트롤 러 를 통 해 한자 가 포 함 된 데 이 터 를 명령 으로 기록 하려 면 입력 에 성공 하지 못 합 니 다.
3.한 자 를 입력 하려 면 코드 를 통 해 이 루어 질 수 있 습 니 다.여기 서 제 가 사용 하 는 것 은 자바 입 니 다.코드 는 다음 과 같 습 니 다.
         /**
	 *          Put  
	 * 
	 * @param tablename
	 * @param conf
	 * @throws Exception
	 */
	public static void insertData(String tableName, HBaseConfiguration conf) {
		HTable table = null;
		try {
			if (table == null) {
				table = new HTable(conf, tableName);
			}
			//      time+6     row   ,     
			String rowname = System.currentTimeMillis() / 1000 + "" + CommUtil.getSixRadom();
			System.out.println("rowname = " + rowname);
			Put p = new Put(Bytes.toBytes(rowname));
			p.add("acc".getBytes(), new Long(System.currentTimeMillis()).longValue(), "   ".getBytes());
			p.add("pwd".getBytes(), new Long(System.currentTimeMillis()).longValue(), "123456".getBytes());
			p.add("sex".getBytes(), new Long(System.currentTimeMillis()).longValue(), "1".getBytes());
			p.add("age".getBytes(), new Long(System.currentTimeMillis()).longValue(), "2222".getBytes());
			table.put(p);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			CommUtil.HBaseClose(table);
		}
	}
 
4、             ,    :
         /**
	 *   HBase    
	 * 
	 * @param tablename
	 * @param conf
	 * @param table
	 */
	public static void scanData(String tableName, HBaseConfiguration conf) {
		HTable table = null;
		Scan s = null;
		ResultScanner scanner = null;
		try {
			if (table == null) {
				table = new HTable(conf, tableName);
			}
			s = new Scan();
			s.addColumn(Bytes.toBytes("acc"));
			scanner = table.getScanner(s);
			for (Result r = scanner.next(); r != null; r = scanner.next()) {
				byte[] value = r.getValue("acc".getBytes());
				String m = new String(value);
				System.out.println("Found row: " + m);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			scanner.close();
		}
	}

 
 
5.결 과 는 정상 적 인 한자 로 되 돌아 갑 니 다.windows 환경 에서 eclipse 콘 솔 에서 한 자 를 출력 하 는 것 을 말 합 니 다.Liux 에서 먼저 콘 솔 에 한 자 를 출력 하면 운영 체제 의 인 코딩 형식 과 관계 가 있 습 니 다.
6.위의 절 차 를 통 해 알 수 있 듯 이 입력 은 코드 순환 을 통 해 입력 되 는 것 입 니 다.물론 위 에 저 는 입력 한 데이터 내용 일 뿐 입 니 다.파일 내용 을 데이터 로 입력 하려 면 코드 를 수정 하고 jar 패키지 로 만들어 Liux 에서 실행 해 야 합 니 다.hbase 에서 MR 코드 로 데 이 터 를 입력 하 는 것 과 관련 이 있 습 니 다.어떻게 설정 하 는 지 에 대해 서 는 제 가 따로 글 을 써 서 간단하게 설명 하 겠 습 니 다.여 기 는 기본 설정 이 완료 되 었 습 니 다.
7.MR 코드 를 작성 하여 파일 데 이 터 를 읽 고 hbase 표 에 입력 합 니 다.코드 는 다음 과 같 습 니 다.
public class InsertDataToHBase {
	public static class InsertDataToHBaseMapper extends Mapper {

		public static String table1[] = { "field1", "field2", "field3"};

		public static String table2[] = { "field1", "field2", "field3"};

		public static String table3[] = { "field1", "field2", "field3"};

		public static HTable table = null;

		protected void setup(Context context) throws IOException, InterruptedException {
			HBaseConfiguration conf = new HBaseConfiguration();
			String table_name = context.getConfiguration().get("tabel_name");
			if (table == null) {
				table = new HTable(conf, table_name);
			}
		}

		public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
			String arr_value[] = value.toString().split("/t");
			String table_name = context.getConfiguration().get("tabel_name");
			String temp_arr[] = table1;
			int temp_value_length = 0;

			if (table_name.trim().equals("table1")) {
				temp_arr = table1;
				temp_value_length = 3;
			} else if (table_name.trim().equals("table2")) {
				temp_arr = table2;
				temp_value_length = 3;
			} else if (table_name.trim().equals("table3")) {
				temp_arr = table3;
				temp_value_length = 3;
			}

			List list = new ArrayList();
			if (arr_value.length == temp_value_length) {
				String rowname = System.currentTimeMillis() / 1000 + "" + CommUtil.getSixRadom();
				Put p = new Put(Bytes.toBytes(rowname));
				for (int i = 0; i < temp_arr.length; i++) {
					p.add(temp_arr[i].getBytes(), "".getBytes(), arr_value[i].getBytes());
				}
				list.add(p);
			}
			table.put(list);
			table.flushCommits();
		}
	}

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
		if (otherArgs.length != 3) {
			System.err.println("Usage: InsertDataToHBase   ");
			System.exit(2);
		}
		conf.set("tabel_name", otherArgs[2]);
		Job job = new Job(conf, "InsertDataToHBase");
		job.setNumReduceTasks(0);
		job.setJarByClass(InsertDataToHBase.class);
		job.setMapperClass(InsertDataToHBaseMapper.class);
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		// job.submit();
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

 
8.데이터 파일 에 한자 가 있 으 면 UTF-8 의 인 코딩 형식 을 요구 합 니 다.그러면 코드 를 통 해 데이터 내용 을 읽 을 때 중국어 로 표시 할 수 있 습 니 다.데이터 파일 이 windows 에 있다 면 UTF-8 로 전환 하 는 인 코딩 형식 으로 저장 하면 한 자 는 3 비트 의 머리 가 있 습 니 다.이런 데 이 터 를 입력 하면 한자 의 머리 앞 에'?'가 표 시 됩 니 다.이것 은 windows 인 코딩 형식 이 Linux 와 다 르 기 때문이다.이러한 문 제 를 처리 하면 파일 을 Linux 에 복사 하여 다음 과 같은 작업 을 할 수 있 습 니 다.
iconv -f GBK -t UTF-8 gbk.txt -o utf8.bcp

또한 주의해 야 할 것 은 파일 접미사 가 txt 라면 변환 한 후에 도 windows 에서 다시 열 어도 시스템 은 기본적으로 세 자리 의 머리 를 추가 합 니 다.따라서 데이터 파일 은 txt 접미사 로 이름 을 짓 지 않 는 것 을 권장 합 니 다.
9.한 자 를 HBase 에 입력 한 후 명령 으로 다음 과 같이 표시 합 니 다.
1279677870714210            column=acc:, timestamp=1279677870656, value=/xB4/xF3/xBE/xF8/xD5/xD0
ASCII 인 코딩 으로 볼 수 있 으 며,이 내용 들 을 UE 로 복사 해 16 진법 으로 보고,이에 대응 하 는 수정 사항 을 볼 수 있 으 며,최종 적 으로 한자'대 묘수'로 표 시 됩 니 다.
 
10.정리 해 보면 내용 을 적 게 쓰 고 코드 를 조금 붙 였 습 니 다.여러분 보 세 요.잘못 쓰 거나 의문 이 있 는 부분 이 있 으 면 저 에 게 메 일 을 보 내 주세요[email protected]

좋은 웹페이지 즐겨찾기