在将reduce()输出加载到HBase shell之前,我们是否需要定义目标表?

时间:2013-06-13 14:28:49

标签: hbase

我安装了HBase但没有创建任何表来加载数据。现在,我们是否需要明确创建表并在HBase shell中提及列名,或者我们是否可以在MapReduce程序中执行此操作,如果我们要将reduce()的输出加载到HBase表中?

1 个答案:

答案 0 :(得分:1)

您需要提前预订。从shell创建它或添加代码以在作业本身中创建表。这是通过代码完成的方式:

HBaseConfiguration conf = HBaseConfiguration.get(); 
HBaseAdmin hbase = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor("TEST");
HColumnDescriptor meta = new HColumnDescriptor("cf".getBytes());
desc.addFamily(meta);
hbase.createTable(desc);

创建表时不需要指定列,但列族是必需的。可以在放入数据时添加列名称。

RDBMS中的列与HBase中的列族之间的区别在于列只是a set of data values of a particular simple type, one for each row of the table,而列族定义了更多,例如compression, number of versions to maintain, time to live, maximum and minimum number of versions等。

一个列系列的核心只是一系列相似的列。这有助于在数据之间建立语义或主题边界。

当您说表中需要2列时,您可以将这两列放在一个系列中,也可以同时放在两个不同的系列中。但是建议家庭数量较少,所以你应该只和一个家庭一起去。

hbase(main):004:0> create 'demo', 'cf'

现在这个表中需要2列:

hbase(main):006:0> put 'demo', 'row1', 'cf:fld1', 'value1'

hbase(main):006:0> put 'demo', 'row1', 'cf:fld2', 'value2'

查看在Put时动态指定列的方式。另请注意,系列仅为cf而非cf:fld1cf:fld2。冒号字符(:)从列名称中分隔列族,并将它们一起称为column qualifier

HTH