hbase-使用importtsv工具从tsv文件导入整数?

vulvrdjw  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(370)

我想在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工具,以便它像第一种情况那样存储数字?
非常感谢你的帮助!

r6hnlfcb

r6hnlfcb1#

我也遇到了同样的问题,最后编写了一个小bash脚本来编码tsv文件的十六进制字符。
编码.sh


# !/bin/bash

# Transforms hexadecimal characters, e.g. \xFF to binary

# http://stackoverflow.com/questions/10929453/bash-scripting-read-file-line-by-line

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo -e "$line"
done < "$1"
``` `./encode.sh $TABLE.tsv|hadoop fs -put - $HDFS_PATH/$TABLE.tsv` 
kadbb459

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操作更加高效。

相关问题