hbase shell 使用rowkey查询数据时,使用单引号无法查询到数据

zhidiantech · · 258 次点击 · · 开始浏览    

在HBase Shell中,虽然主要使用的是HBase特有的一套命令语法,但因为Shell本身基于Java实现,所以其对单引号(')和双引号(")的处理遵循Java和大多数Unix/Linux shell的传统规则。

在HBase Shell中,单引号和双引号主要用作字符串的界定符,它们的主要区别如下:

单引号 ('')

  1. 原样输出: 单引号内的一切字符均被视为字面值,不进行任何特殊字符的转义或变量替换。这意味着在单引号内,即使是美元符号$、反斜杠\或回车等特殊字符,也会被当作普通字符处理。

  2. 禁止变量扩展: 在单引号包围的字符串中,无法引用或展开变量。例如,如果你有一个变量my_rowkey,试图在单引号内使用'$my_rowkey'将会直接打印出$my_rowkey作为文本,而不会解析其实际值。

  3. 不能嵌套单引号: 单引号字符串内部不能直接包含单引号(除非使用转义,但在某些Shell环境中可能受限)。若需要在单引号字符串中插入单引号,通常需要采用拼接或其他方式绕过。

双引号 ("")

  1. 部分转义: 双引号内大部分特殊字符仍会被视为字面值,但一些特定的转义序列(如\n\t等)会被正确解释。此外,美元符号$及其后续内容可以触发变量扩展或命令替换。

  2. 变量扩展: 在双引号内,可以正常引用并展开变量。例如,"$my_rowkey"会打印出my_rowkey变量的实际值。

  3. 保留内部单引号: 双引号内可以包含单引号,且该单引号会被原样保留,不会导致字符串界定的结束。

在HBase Shell中,单引号和双引号通常用于定义字符串参数,如RowKey、Column Family、Qualifier、Value等,特别是在执行putgetscan等命令时:

# 使用单引号的例子(假设RowKey是纯文本,无需变量或特殊字符)
put 'my_table', 'row1', 'cf1:q1', 'value1'

# 使用双引号的例子(假设RowKey未十六进制或存储在变量中)
put 'my_table', "$my_rowkey", 'cf1:q1', 'value1'

总结来说,在HBase Shell中选择使用单引号还是双引号,取决于是否需要进行变量扩展、是否需要支持特定的转义序列,以及字符串内容是否包含单引号。如果字符串是静态的、不包含特殊字符且不需要变量替换,单引号往往更简洁;如果需要动态插入变量值或支持特定转义,应使用双引号。

注意:
如果是十六进制必须用双引号,如
scan 'table_name',{STOPROW=>"\xC1\x00\x09\x87@P*\x9B\x17q\x9D\x9F\xD2\xC8\xAB\xD8\x00\x00\x01\x8F\x0E\xB2W\xC1",STARTROW=>"\xC1\x00\x09\x87@P*\x9B\x17q\x9D\x9F\xD2\xC8\xAB\xD8\x00\x00\x01\x8F\x0E\xB1m_",LIMIT => 10}

单引号会查不到数据

258 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传