我正在使用importtsv工具来摄取数据。我有些疑惑。我正在使用hbase 1.1.5。
首先它会摄取非字符串/数值吗?我在这个链接中详细介绍了cloudera发行版中的importtsv。它说:“它将一切都解释为字符串”。所以我猜这是什么意思。
我使用简单的wordcount示例,其中第一列是单词,第二列是单词计数。
当我保存文件时如下:
"access","1"
"about","1"
并摄取,然后在hbase shell上进行扫描,它提供以下输出:
about column=f:count, timestamp=1467716881104, value="1"
access column=f:count, timestamp=1467716881104, value="1"
当我按如下方式保存文件时(删除了围绕计数的双引号):
"access",1
"about",1
并摄取然后在hbase shell上进行扫描,它会给出以下输出(围绕计数的双引号不存在):
about column=f:count, timestamp=1467716881104, value=1
access column=f:count, timestamp=1467716881104, value=1
因此,您可以看到计数值中没有双引号。
Q1。这是否意味着它存储为整数而不是字符串? cloudera的文章建议需要编写自定义MR作业来摄取非字符串值。但是,如果上面是摄取整数值,我无法得到这意味着什么。
另外我怀疑的是,当它出现在列值内时是否可以转义列分隔符。例如,在importtsv中,我们可以按如下方式指定分隔符:
-Dimporttsv.separator=,
但是,如果我的员工数据中第一列是员工姓名而第二列是地址怎么办?我的文件将有类似于这样的行:
"mahesh","A6,Hyatt Appartment"
第二个逗号使importtsv认为有三列并抛出BadTsvLineException("Excessive columns")
。
因此,我尝试使用反斜杠(\
)转义逗号,只是为了好奇,用另一个反斜杠(即\\
)转义反斜杠。所以我的文件有以下几行:
"able","1\"
"z","1\"
"za","1\\1"
当我在hbase shell上运行扫描时,它给出了以下输出:
able column=f:count, timestamp=1467716881104, value="1\x5C"
z column=f:count, timestamp=1467716881104, value="1\x5C"
za column=f:count, timestamp=1467716881104, value="1\x5C\x5C1"
Q2。因此,似乎不是在反斜杠后转义字符,而是将反斜杠编码为\x5C
。是这样的吗?使用importtsv批量加载数据时,是否无法转义列分隔符?