我想在hbase表中轻松加载数据。我想用 ImportTsv
工具将是理想的。像这样:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv '-Dimporttsv.separator=;' -Dimporttsv.columns=HBASE_ROW_KEY,f:i tab import.tsv
我希望列“f:i”中的值存储为字节(十六进制),而不是字符串。因为直接的结果是我无法使用需要进行整数比较的过滤器查询该列。
1-如果我使用put in the shell:
p = Put.new(Bytes.toBytes('r1'))
p.add(bytes('f'), Bytes.toBytes('i'), Bytes.toBytes(10));
tab.put(p)
我得到:
r1 column=f:i, timestamp=1398519413393, value=\x00\x00\x00\x00\x00\x00\x00\x0A
2-如果我使用importtsv工具,我得到:
r1 column=f:i, timestamp=1398519413393, value=10
但在这种情况下,使用以下过滤器(作为示例)的扫描将不再有效:
f = SingleColumnValueFilter.new(
Bytes.toBytes('f'),
Bytes.toBytes('i'),
CompareFilter::CompareOp::LESS_OR_EQUAL,
BinaryComparator.new(Bytes.toBytes(70))
)
所以基本上,有没有一种简单的方法来微调importtsv工具,以便它像第一种情况那样存储数字?
非常感谢你的帮助!
2条答案
按热度按时间r6hnlfcb1#
我也遇到了同样的问题,最后编写了一个小bash脚本来编码tsv文件的十六进制字符。
编码.sh
kadbb4592#
托尼,运气不好。importtsv是错误的二进制数据工具。实际上它根本不是一个好工具。
看起来你需要类似于我的解决方案:
导入数据和输出的mapreduce作业
HFile
形象。completebulkload
准备散装工具HFile
.参考文献:https://hbase.apache.org/book/arch.bulk.load.html
更多详细信息:
对于导入mapreduce作业,实际上只需要mapper。该Map器应产生
Put
物体。寻找importtsv本身。导入作业的其余部分只配置了如下内容
HFileOutputFormat2.configureIncrementalLoad(Job, HTable)
.我建议使用hfilev2,因为有很多原因,从在现代社会支持hfilev1的运气开始
HBase
集群。completebulkload
只是准备使用的工具。我个人在这个阶段有我的自定义mapreduce工作,因为我的表中有像snappy这样的本地东西,不想在客户机上安装任何本地东西。所以我只需要启动一个mapper,它从hdfs中获取hfile图像并与指定的表合并。看起来有点复杂,但确实值得你自己去做。好处是etl操作更加高效。