`
dajuezhao
  • 浏览: 59786 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HBase中关于中文的处理

阅读更多

1、HBase版本hbase-0.20.5,Hadoop的版本hadoop-0.20.2,JDK1.6

2、在HBase中创建了表,如果想通过控制台使用命令写入含有汉字的数据,录入是不成功的。

3、如果想对汉字进行录入,可以通过代码实现,这里我使用的是java,代码如下:
/**
* 向指定的表插入单个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控制台输出的是汉字。如果是在linux下先在控制台输出汉字,则和操作系统的编码格式有关系。

6、通过上面的步骤可以看出来,输入是通过代码循环录入,当然,上面我只是录入的一条数据内容。如果想把文件内容作为数据的输入,那么需要把代码修改,并打成jar包在linux上执行。这里涉及到了在hbase中采用MR代码来录入数据。至于如何配置,我会另外写一片文章来简单概述一下,这里我就默认已配置完成。

7、编写MR代码,读取文件数据,并录入到hbase表中,代码如下:
public class InsertDataToHBase {
public static class InsertDataToHBaseMapper extends Mapper<Object, Text, NullContext, NullWritable> {

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<Put> list = new ArrayList<Put>();
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 <inpath> <outpath> <tablename>");
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再次打开,系统也会默认给你增加3个位的头。所以建议数据文件不要以txt后缀命名。

9、汉字录入HBase之后,使用命令查看显示如下:

1279677870714210 column=acc:, timestamp=1279677870656, value=\xB4\xF3\xBE\xF8\xD5\xD0

可以看到是ASCII编码,可以将这些内容拷贝到UE,以16进制查看,然后对应的修改,可以看到最终显示是汉字“大绝招”



10、总结一下,内容写的比较少,代码贴了一些,大家看看,如果觉得有写的不对的或是有疑问的地方,可以给我发邮件dajuezhao@gmail.com

分享到:
评论

相关推荐

    HBase权威指南中文版

    探讨了与Hadoop的高度集成如何使HBase的可伸缩性变得简单...在HBase中集成用于海量并行数据处理任务的Hadoop的MapReduce框架;助你了解如何调节集群、设计模式、拷贝表、导入批量数据、删除节点以及其他更多的任务等。

    Hbase实战 中文版

    Hbase实战中文版 《HBase实战》是一本基于经验提炼而成的指南,它教给读者如何运用HBase设计、搭建及运行大数据应用系统。全书共分为4个部分。前两个部分分别介绍了分布式系统和大规模数据处理的发展历史,讲解...

    HBase视频教程下载|基于微博数据应用的HBase实战开发

    在大数据热潮中,推出了NoSQL数据库,这种天生就为分布式存储而设计的技术,尤其以Apache HBase为代表,占领海量数据存储技术的大半壁江山。本教视从实战角度出来,向学员们手把手掌握HBase使用精髓,让学员达到如下...

    hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 1. 简介 HBase是一个分布式的、面向列的开源数据库,源于...

    Hadoop权威指南 中文版

    本书从hadoop的缘起开始,由浅入深... ·利用hadoop数据库hbase来保存和处理结构化/半结构化数据  ·学会使用zookeeper来构建分布式系统  如果您拥有海量数据,无论是gb级还是pb级,hadoop都将是您的完美解决方案。

    Hadoop 权威指南(中文版)

    本书从hadoop的缘起开始,... ·利用hadoop数据库hbase来保存和处理结构化/半结构化数据  ·学会使用zookeeper来构建分布式系统  如果您拥有海量数据,无论是gb级还是pb级,hadoop都将是您的完美解决方案。

    中文版Hadoop权威指南

    本书是hadoop权威参考,程序员可... ·利用hadoop数据库hbase来保存和处理结构化/半结构化数据  ·学会使用zookeeper来构建分布式系统  如果您拥有海量数据,无论是gb级还是pb级,hadoop都将是您的完美解决方案。

    hadoop权威指南第三版 中文 pdf

    本书从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。全书共14章,3个附录,涉及的主题包括:Hadoop简介;MapReduce简介;Hadoop分布式文件系统;Hadoop的I/...

    LarkMidTable 一站式开源的数据中台.rar

    Lark中文名称 云雀,云代表大数据,雀代表平凡和自由。 LarkMidTable 是一站式开源的数据中台,实现元数据管理,数据仓库开发,数据质量管理,数据的可视化,实现高效赋能数据前台并提供数据服务的产品。 产品愿景...

    《Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案》part1

    高清版(中文) 《Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案》主要介绍如何使用开源ETL工具来完成数据整合工作。 《Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案》介绍的PDI(Kettle)是一种开源...

    Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案 part2

    除了ODS/DW类比较大型的应用外,Kettle 实际还可以为中小企业提供灵活的数据抽取和数据处理的功能。Kettle除了支持各种关系型数据库、HBase、MongoDB这样的NoSQL数据源外,它还支持Excel、Access这类小型的数据源。...

    Hadoop权威指南 第二版(中文版)

     本书从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。全书共16章,3个附录,涉及的主题包括:Haddoop简介;MapReduce简介;Hadoop分布式文件系统;Hadoop...

    Hadoop权威指南中文版第一版

    本书从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。全书共14章,3个附录,涉及的主题包括:Haddoop简介;MapReduce简介;Hadoop分布式文件系统;Hadoop的I...

    hadoop权威指南(中文第2版)

    《hadoop权威指南(第2版)》从hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍hadoop这一高性能处理海量数据集的理想工具。全书共16章,3个附录,涉及的主题包括:haddoop简介;mapreduce简介;hadoop...

    Hadoop权威指南(中文版)2015上传.rar

    第2章 关于MapReduce 一个气象数据集 数据的格式 使用Unix工具进行数据分析 使用Hadoop分析数据 map阶段和reduce阶段 横向扩展 合并函数 运行一个分布式的MapReduce作业 Hadoop的Streaming Ruby版本 Python版本 ...

    大数据分析与应用期末考试.docx

    A、1KB、基本单位是字节(Byte) C、一个汉字需要一个字节的存储空间(正确答案) D、一个字节能够容纳一个英文字符, 16、不属于Hadoop生态系统的是() [单选题] * A、HDFS B、GFS(正确答案) C、HBase D、Hive 17、...

    Hadoop实战中文版

    《Hadoop实战》作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,是谷歌实现云计算的重要基石。《Hadoop实战》分为3个部分,深入浅出地...

    Google 三大论文中文版

    Google的很多项目将数据存储在Bigtable中,包括Web索引、Google Earth、Google Finance。这些应用对Bigtable提出的要求差异非常大,无论是在数据规模(从URL到网页到卫星图像)还是在响应速度上(从后端的批量处理到...

Global site tag (gtag.js) - Google Analytics