使用importtsv工具批量加载数据时转义分隔符并提取数值

时间:2016-07-07 13:52:40

标签: hadoop hbase

我正在使用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批量加载数据时,是否无法转义列分隔符?

0 个答案:

没有答案