Вставьте данные в Hbase, используя Stargate Rest
Я использую curl для доступа к Hbase с помощью REST. У меня проблема с вставкой данных в 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
Как правильно это сделать? потому что это дает мне ошибку Bad Request.
Кроме того, я пытаюсь сделать то же самое в клиенте 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 ответа
Это была очень простая ошибка. Hbase ожидает каждое значение в кодировке base64. Ключ, а также columnfamily:column должен быть закодирован в base64 перед вводом в xml.
Вставить легко, используя звездную базу.
$ 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()