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

Csv HBase-使用ImportTsv工具从TSV文件导入整数?,csv,import,hbase,jruby,nosql,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”中的值存储为字节(十六进制),而不是字符串。因为直接的结果是,我无法使用需要进行整数比较的过滤器查询该列 1-如果我使用put in

我想在我的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:

我得到:

2-如果我使用ImportTsv工具,我会得到:

但在这种情况下,使用以下过滤器(作为示例)的扫描将不再有效:

f = SingleColumnValueFilter.new(
  Bytes.toBytes('f'),
  Bytes.toBytes('i'),
  CompareFilter::CompareOp::LESS_OR_EQUAL,
  BinaryComparator.new(Bytes.toBytes(70))
)
那么,基本上,有没有一种简单的方法来微调ImportTsv工具,以便它像第一种情况那样存储数字

非常感谢你的帮助

托尼,运气不好。 Importtsv是用于二进制数据的错误工具。其实这根本不是一个好工具

看起来您需要类似于我所做的解决方案:

  • MapReduce作业,用于导入数据并输出
    HFile
    image
  • completebulkload
    准备好批量装载的工具
    HFile
参考:

更多详情:

  • 对于导入MapReduce作业,实际上只需要mapper。该映射器应产生
    Put
    对象序列。寻找importtsv本身
  • 导入作业的其余部分只配置了类似于
    HFileOutputFormat2.configureIncrementalLoad(作业,HTable)
    的内容
  • 从现代
    HBase
    集群中支持hfilev1开始,我建议使用HFileV2,原因有很多
  • completebulkload
    刚刚准备好使用该工具。我个人在这个阶段有自己的自定义MapReduce作业,因为我的表中有Snappy之类的本机内容,不想在客户端上安装任何本机内容。所以我只需要启动单一映射器,它从HDFS获取HFile图像并与指定的表合并

看起来有点复杂,但确实值得你自己去做。好处是ETL操作更加高效。

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

encode.sh

#/bin/bash
#将十六进制字符(例如.\xFF)转换为二进制
# http://stackoverflow.com/questions/10929453/bash-scripting-read-file-line-by-line
而IFS=''读-r行| |[[-n“$line”];做
回声-e“$line”
完成<“$1”

/encode.sh$TABLE.tsv | hadoop fs-put-$HDFS\u PATH/$TABLE.tsv

谢谢。我想你是对的,但我希望有一个更简单的解决方案:-)暂时,我用Jruby接口解析和导入我的数据文件。它更长,但更容易实现:-)取决于您的需求。我真的需要强有力的解决方案,所以我宁愿花时间,但得到工作的东西。目前我正在评估Spark是否适合此类任务。更复杂但真正强大。顺便说一句,我的+1;-)在哪里?但请注意:所以请小心。HBase 0.96实际上将HFile V1从市场上淘汰,因此我更喜欢批量加载的标准解决方案。V3可能很快成为唯一的选项。我们最终稍微修改了类“TsvImporterMapper.java”,以满足我们对整数的需求。事实上,比使用一层JRuby快得多。你得到了你的+1;-)但请检查您是否正在使用HFileV2基础设施。V1正在死亡(例如,Cloudera已经死亡)。
r1  column=f:i, timestamp=1398519413393, value=\x00\x00\x00\x00\x00\x00\x00\x0A
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))
)
#!/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"