如何通过 REST api 删除具有二进制 rowkey 的 HBase 单元格?
How to delete an HBase cell with a binary rowkey through REST api?
通过 REST api 删除 HBase 单元的路径是 /<table>/<row>/<column>:<qualifier>
。如果 rowkey 是一个字符串,比如 "Hello",它就可以工作。但是当rowkey是二进制数据(比如180的整数)时,应该如何对rowkey进行编码呢?我尝试对 rowkey 进行 base64 编码并获得状态代码 200,但该单元格根本没有被删除。
示例:
我试图通过向路径 http://ecs5.njzd.com:20550/X/ZAAAAA==/C:c1
发送 DELETE 请求来删除单元格,其中 ecs5.njzd.com:20550
是 HBase REST 服务器的主机名和端口,X
是table,ZAAAAA==
是行键100
(int)的base64解码值,C:c1
是列名。我收到状态代码为 200 的响应,但该单元格仍存在于 table 中。
我只是尝试了下面的命令,它对我有用。您不要在删除查询中发送 base64 编码的数据。
curl -v -X 删除 "Content-Type: text/xml" http://hostname:port/testtable/10101/colfam1:col1
如果它不起作用,请粘贴您的 table 的 hbase 扫描输出,这将提供关于准备删除查询的想法。
删除不像 put 或 get 那样直接。它取决于主要压缩、基于版本、基于时间戳、自动刷新等。所以当你说你看到它回来时,请也验证这些设置。正如@Shashi 所说,模式本身是为在 Rest API 中删除而定义的,以使用编码处理它,因此您不需要发送编码数据
正确的方法是将rowkey
写成对应字节数组的十六进制转义表示形式。比如rowkey是整数100,我应该把rowkey写成d\x00\x00\x00
,也就是整数100
的十六进制转义表示。
实际上,当您在 HBase shell 中扫描 table 时,如果 rowkey
或 value
不是字符串,您将看到相同的结果。
通过 REST api 删除 HBase 单元的路径是 /<table>/<row>/<column>:<qualifier>
。如果 rowkey 是一个字符串,比如 "Hello",它就可以工作。但是当rowkey是二进制数据(比如180的整数)时,应该如何对rowkey进行编码呢?我尝试对 rowkey 进行 base64 编码并获得状态代码 200,但该单元格根本没有被删除。
示例:
我试图通过向路径 http://ecs5.njzd.com:20550/X/ZAAAAA==/C:c1
发送 DELETE 请求来删除单元格,其中 ecs5.njzd.com:20550
是 HBase REST 服务器的主机名和端口,X
是table,ZAAAAA==
是行键100
(int)的base64解码值,C:c1
是列名。我收到状态代码为 200 的响应,但该单元格仍存在于 table 中。
我只是尝试了下面的命令,它对我有用。您不要在删除查询中发送 base64 编码的数据。
curl -v -X 删除 "Content-Type: text/xml" http://hostname:port/testtable/10101/colfam1:col1
如果它不起作用,请粘贴您的 table 的 hbase 扫描输出,这将提供关于准备删除查询的想法。
删除不像 put 或 get 那样直接。它取决于主要压缩、基于版本、基于时间戳、自动刷新等。所以当你说你看到它回来时,请也验证这些设置。正如@Shashi 所说,模式本身是为在 Rest API 中删除而定义的,以使用编码处理它,因此您不需要发送编码数据
正确的方法是将rowkey
写成对应字节数组的十六进制转义表示形式。比如rowkey是整数100,我应该把rowkey写成d\x00\x00\x00
,也就是整数100
的十六进制转义表示。
实际上,当您在 HBase shell 中扫描 table 时,如果 rowkey
或 value
不是字符串,您将看到相同的结果。