Вставьте данные в 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()
Другие вопросы по тегам