Това ръководство е третото от поредица, която изследва използването на интерфейса Apache HBase REST. Част 1 обхвана основите на HBase REST, някои предупреждения на Python и администриране на таблици. Част 2 ви показа как да вмъкнете няколко реда едновременно с помощта на XML и JSON. Част 3 по-долу ще покаже как да получите няколко реда с помощта на XML и JSON.
Получаване на редове с XML
Използване на GET
глагол, можете да извлечете един ред или група от редове въз основа на техните ключове за редове. (Можете да прочетете повече за формата на URL адрес с множество стойности тук.) Тук ще използваме обикновения заместващ знак или звездичка (*), за да получим всички редове, които започват с конкретен низ. В този пример можем да заредим всеки ред от комедиите на Шекспир с „shakespeare-comedies-*“. Това също изисква нашите ключове за редове да бъдат изложени с „AUTHOR-WORK-LINENUMBER“.
Ето кода за получаване и работа с XML изхода:
request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "text/xml"}) root = fromstring(request.text) # Go through every row passed back for row in root: message = '' linenumber = 0 username = '' # Go through every cell in the row for cell in row: columnname = base64.b64decode(cell.get('column')) if cell.text == None: continue if columnname == cfname + ":" + messagecolumn: message = base64.b64decode(cell.text) elif columnname == cfname + ":" + linenumbercolumn: linenumber = decode(cell.text) elif columnname == cfname + ":" + usernamecolumn: username = base64.b64decode(cell.text) rowKey = base64.b64decode(row.get('key'))
Започваме кода с get
искане. Това get
ще върне всички реплики в комедиите на Шекспир. Тези редове ще се върнат като XML поради промяната в Accept
заглавка.
След това вземаме XML, върнат от заявката, и го превръщаме в XML DOM. Всеки ред от HBase е в отделен елемент на ред. Ще използваме for
цикъл, за да преминете през всеки ред.
Всяка клетка в реда е отделен XML елемент. Ще използваме друг for
цикъл, за да преминете през всички тези клетки. (Този блок от код може да бъде опростен чрез използване на XPath за намиране на правилните елементи.) При намиране на всяка колона стойността се записва в променлива. (Методът за декодиране е разгледан в част 1 от тази серия.) Всички стойности, които се връщат в XML, са кодирани в base64 и трябва да бъдат декодирани, преди да се използват.
Накрая ключът на реда се извлича и декодира.
След като всички данни бъдат намерени и декодирани, можете да започнете да ги използвате. Вашият код ще започне след декодиране на реда. Имайте предвид, че някои от тези променливи не е необходимо да се декодират – правя всички тук за пълнота.
Получаване на редове с JSON
Работата с JSON е точно като работата с XML:Използване на get
глагол, можете да извлечете един ред или група от редове въз основа на техния ключ на реда.
Ето кода за получаване и работа с JSON изхода:
request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "application/json"}) bleats = json.loads(request.text) for row in bleats['Row']: message = '' lineNumber = 0 username = '' for cell in row['Cell']: columnname = base64.b64decode(cell['column']) value = cell['$'] if value == None: continue if columnname == cfname + ":" + messagecolumn: message = base64.b64decode(value) elif columnname == cfname + ":" + linenumbercolumn: lineNumber = decode(str(value)) elif columnname == cfname + ":" + usernamecolumn: username = base64.b64decode(value) rowKey = base64.b64decode(row['key'])
Започваме кода с get
заявка, която ще върне всички реплики в комедиите на Шекспир. Тези редове ще се върнат като JSON поради промяната в Accept
заглавка.
След това вземаме JSON, върнат от заявката, и го превръщаме в JSON обект. Всеки ред от HBase е в отделен индекс в масива от редове. Ще използваме for
цикъл, за да преминете през всеки ред.
Всяка клетка в реда е отделен индекс на масив. Ще използваме друг for
цикъл, за да преминете през всички тези клетки. Когато всяка колона бъде намерена, стойността се записва в променлива. Всички стойности, които се връщат в JSON, са кодирани в base64 и трябва да бъдат декодирани, преди да ги използвате. (Отново, методът за декодиране се обсъжда в част 1 тази серия.) Обърнете внимание, че стойностите се връщат в записа на знака за долар ($).
Накрая ключът на реда се извлича и декодира.
След като всички данни бъдат намерени и декодирани, можете да започнете да ги използвате.
Използване на curl
Както е показано в документацията на REST интерфейса, можете да използвате curl за извеждане на XML или JSON директно в конзолата. Например, можете да направите същото get, както току-що направихме, използвайки curl. Командата е:
curl -H "Accept: text/xml" http://localhost:8070/tablename/shakespeare-comedies-*
Тази команда ще ви даде XML изхода. За да получите изхода на JSON, командата е:
curl -H "Accept: application/json" http://localhost:8070/tablename/shakespeare-comedies-*
С команди като тези можете бързо да видите какво се връща или как изглеждат данните. Можете да използвате curl, за да видите кода на състоянието на REST повикване с:
[user@localhost HBaseREST]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/shakespeare-comedies-* HTTP/1.1 200 OK Content-Length: 0 Content-Type: text/xml
Заключение
Интерфейсът HBase REST е добър начин да използвате HBase, ако не искате да използвате Java. Той ви предлага познат REST интерфейс, който е вграден в много езици, както и познат формат на данни.
Надяваме се, че примерните кодове и обясненията в тази серия ще ви спестят много търсене в Google, когато се захващате с вашия проект RESTful HBase.
Джеси Андерсън е инструктор в университета Cloudera.