HBase - 使用ImportTsv工具从TSV文件导入整数?

时间:2014-04-26 14:58:29

标签: csv import hbase jruby nosql

我想在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工具,以便它像第一种情况一样存储数字?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

托尼,没有运气。 Importtsv是二进制数据的错误工具。实际上它根本不是好工具。

看起来你需要类似我的解决方案:

  • 导入数据并输出HFile图像的MapReduce作业。
  • completebulkload工具批量加载已准备好的HFile

参考:https://hbase.apache.org/book/arch.bulk.load.html

更多详情:

  • 要导入MapReduce作业,您实际上只需要mapper。该映射器应生成Put个对象的序列。寻找importtsv本身。
  • 其余的导入作业只配置了HFileOutputFormat2.configureIncrementalLoad(Job, HTable)
  • 之类的内容
  • 我建议使用HFileV2,因为从现代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