使用Stargate Rest将数据插入Hbase

时间:2012-04-04 07:09:43

标签: python rest insert hbase stargate

我正在使用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>

2 个答案:

答案 0 :(得分:4)

这是一个非常简单的错误。 Hbase期望base64编码中的每个值。密钥以及columnfamily:在输入xml之前,列必须是base64编码。

答案 1 :(得分:0)

使用starbase轻松插入。

$ pip install starbase

使用列table1col1

创建名为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')

仅提取col1col2数据:

table.fetch('row1', ['col1', 'col2'])

仅提取col1:key1col2:key4数据:

table.fetch('row1', {'col1': ['key1'], 'col2': ['key4']})

更改表架构:

添加列col3col4

table.add_columns('col3', 'col4')

删除列

table.drop_columns('col1', 'col4')

显示表格列

table.columns()

显示所有表格

connection.tables()