我正在使用curl通过REST访问Hbase。我在将数据插入Hbase时遇到问题。我遵循Stargate文档,但是当我遵循相同的语法时,它给出了400/405错误的错误请求和方法不允许错误。我已粘贴下面的命令。请告诉我哪里出错了。
Stargate文档说
POST /<table>/<row>/<column> (:qualifier)?/<timestamp>
curl -H "Content-Type: text/xml" --data '[...]' http://localhost:8000/test/testrow/test:testcolumn
我的curl命令如下:
curl -H "Content-Type: text/xml" --data '[<CellSet><Row key="111"><Cell column="f1">xyz</Cell></Row></CellSet>]' http://localhost:8080/mytable/row/fam
这样做的正确方法是什么?因为这给了我错误的请求错误。
另外,我在Python客户端中尝试相同。它给了我ColumnFamilyNotFoundException。我正在读取要从文件传递到星际之门服务器的Xml数据。代码如下。
url = 'http://localhost:8080/mytable/row/fam'
f = open('example.xml', 'r')
xmlData = f.read()
r = requests.post(url, data=xmlData, headers=headers)
example.xml具有以下内容:
<CellSet>
<Row key="111">
<Cell column="fam:column1">
xyz
</Cell>
</Row>
</CellSet>
答案 0 :(得分:4)
这是一个非常简单的错误。 Hbase期望base64编码中的每个值。密钥以及columnfamily:在输入xml之前,列必须是base64编码。
答案 1 :(得分:0)
使用starbase轻松插入。
$ pip install starbase
使用列table1
和col1
col2
的表格
from starbase import Connection
connection = Connection()
table = connection.table('table1')
table.create('col1', 'col2')
在table1
中插入一行。行键为row1
。
table.insert(
'row1',
{
'col1': {'key1': 'val1', 'key2': 'val2'},
'col2': {'key3': 'val3', 'key4': 'val4'}
}
)
您也可以批量插入。
不要复制代码,假设我们的数据存储在data
变量(dict)中。
data = {
'col1': {'key1': 'val1', 'key2': 'val2'},
'col2': {'key3': 'val3', 'key4': 'val4'}
}
batch = table.batch()
for i in range(100, 5000):
batch.insert('row_%s' % i, data)
batch.commit(finalize=True)
使用update
方法完成更新,其工作方式与insert
相同。
要使用fetch
方法获取行。
获取整行:
table.fetch('row1')
仅获取col1
个数据:
table.fetch('row1', 'col1')
仅提取col1
和col2
数据:
table.fetch('row1', ['col1', 'col2'])
仅提取col1:key1
和col2:key4
数据:
table.fetch('row1', {'col1': ['key1'], 'col2': ['key4']})
更改表架构:
添加列col3
和col4
table.add_columns('col3', 'col4')
删除列
table.drop_columns('col1', 'col4')
显示表格列
table.columns()
显示所有表格
connection.tables()