`
dajuezhao
  • 浏览: 60488 次
  • 性别: 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官方文档中文版-HBase手册中文版

    HBase是一种分布式、基于列族的NoSQL数据库,由Apache软件基金会开发并维护,是Hadoop生态系统中的重要组件。这份“HBase官方文档中文版”提供了全面深入的HBase知识,帮助用户理解和掌握如何在大数据场景下有效地...

    Hbase 官方中文文档

    HBase官方中文文档概述了Apache HBase TM的基本概念、配置...综上所述,HBase官方中文文档为用户提供了全面的关于HBase安装、配置、使用、优化、安全和维护等环节的知识,是使用和管理HBase集群不可或缺的参考资料。

    Python-HBase中文参考指南

    **Python-HBase中文参考指南** 在大数据处理领域,Apache HBase是一个重要的分布式列式数据库,它构建于Hadoop之上,提供了高并发、低延迟的数据存储服务。本指南针对HBase的中文用户,旨在帮助读者更好地理解和...

    HBase官方文档

    HBase与MapReduce的集成是HBase在大数据处理中的一个关键特性。用户可以在MapReduce程序中访问HBase中的数据,也可以将MapReduce作为批量加载数据到HBase中的手段。 ### HBase安全 HBase的安全章节讲述了如何安全...

    HBase中文教程.pdf

    HBase是Apache软件基金会下的Hadoop项目中的一个子项目,它是一个分布式、面向列的NoSQL数据库系统,主要用来解决大量结构化数据的存储和实时读写访问问题。HBase的设计灵感来源于谷歌的Bigtable,提供了对海量数据...

    HBase中文教程 PDF 下载

    通过阅读《HBase中文教程》,Java开发者不仅可以了解HBase的基本原理,还能学会如何在实际工作中运用HBase解决大数据存储和处理问题,提升项目效率。无论是对大数据感兴趣的初学者,还是有经验的开发者,都能从这本...

    HBase中文API

    HBase中文API为开发者提供了在中文环境中操作HBase的便利。 1. **入门** - **介绍**: HBase为大数据处理提供了实时读写能力,特别适合于存储海量稀疏数据。 - **快速开始**: 开发者通常需要了解如何创建表、插入...

    Hbase中文文档和官方英文文档PDF.7z

    这个压缩包文件包含的"**Hbase中文文档和官方英文文档PDF**"是学习和理解HBase的重要资源,无论是对于初学者还是经验丰富的开发者来说,都是不可或缺的参考资料。 **Hbase中文文档**: 中文文档通常会提供更易懂的...

    HBase in Action(中文)

    《HBase in Action》是一本专门介绍HBase的入门书籍,旨在帮助读者深入理解并掌握分布式列式数据库HBase的核心概念和技术。...通过阅读这本书,你将能够熟练地掌握HBase的使用,解决大数据存储和处理中的各种挑战。

    HBase官方文档中文版

    - **列元数据与Joins**:讲解了HBase如何处理列的元数据信息以及HBase中不支持的传统SQL JOIN操作。 - **ACID属性**:分析了HBase支持的事务特性及其局限性。 #### 六、HBase与Schema设计 - **Schema创建**:指导...

    《Learning HBase中文版》

    通过《Learning HBase中文版》这本书的学习,读者不仅能够全面理解HBase的技术细节,还能获得在实际项目中部署和管理HBase的经验。无论是开发人员还是运维人员,都能从中受益,提升自己在大数据领域的技能。

    Hbase权威指南高清中文版本.pdf

    《HBase权威指南高清中文版本》是一本深入探讨HBase技术的专业书籍,旨在为读者提供全面、详尽的HBase知识。HBase是构建在Apache Hadoop之上的一款分布式、高性能、列族式数据库,适用于处理大规模数据。这本书的...

    hbase中文文档,适合初学者学习

    Apache HBase 是一款基于 Apache Hadoop 和 Apache ...总的来说,这份HBase中文文档是初学者了解和掌握HBase的宝贵资源,涵盖了从安装、配置、使用到优化和维护的全过程,有助于用户快速上手并熟练掌握HBase的使用。

    HBase权威指南中文版

    《HBase权威指南中文版》是一本深入探讨大数据领域中分布式数据库HBase的专著。这本书旨在帮助读者理解和掌握如何有效地使用HBase处理大规模数据存储和检索问题。HBase是建立在Apache Hadoop之上,一个面向列的、...

    hbase源码带中文注释

    3. **HBase Hadoop2 Compat**: 这是HBase与Hadoop 2.x版本兼容的模块,确保HBase能在Hadoop生态系统中无缝运行。通过阅读源码,可以理解HBase如何与YARN、HDFS和其他Hadoop组件交互。 4. **HBase Thrift**: 提供了...

    Learning HBase(中文版)

    3. **数据模型**:解析HBase的列式存储模型,对比传统关系型数据库,阐述其在大数据处理中的优势。 4. **操作HBase**:讲解如何创建、修改和删除HBase表,以及如何进行数据的插入、查询和更新操作。 5. **API和...

Global site tag (gtag.js) - Google Analytics