我想在HBase表中轻松加载数据。我认为使用ImportTsv
工具是理想的。有这样的事情:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv '-Dimporttsv.separator=;' -Dimporttsv.columns=HBASE_ROW_KEY,f:i tab import.tsv
我想要列中的值" f:i"存储为字节(十六进制)NOT不作为字符串。因为直接后果是我无法使用需要进行整数比较的过滤器来查询该列。
1 - 如果我在shell中使用put:
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工具,以便它像第一种情况一样存储数字?
非常感谢你的帮助!
答案 0 :(得分:1)
看起来你需要类似我的解决方案:
HFile
图像的MapReduce作业。completebulkload
工具批量加载已准备好的HFile
。参考:https://hbase.apache.org/book/arch.bulk.load.html
更多详情:
Put
个对象的序列。寻找importtsv本身。HFileOutputFormat2.configureIncrementalLoad(Job, HTable)
。HBase
群集中的HFile V1支持运气开始,有很多原因。completebulkload
只是随时可用的工具。我个人在这个阶段有我的自定义MapReduce作业,因为我在表中有像Snappy这样的原生内容,并且不想在客户端上安装任何本机内容。所以我只是启动单一映射器,它从HDFS中获取HFile图像并与指定的表合并。看起来有些复杂,但确实值得自己做。效益是更有效的ETL操作。
答案 1 :(得分:0)
我遇到了同样的问题,最后写了一个小的bash脚本来编码tsv文件的十六进制字符。
encode.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