Вторият практически инструкции от поредицата за използването на Apache HBase Thrift API
Последния път разгледахме основите на свързването с Thrift чрез Python. Този път ще научите как да вмъквате и получавате няколко реда наведнъж.
Работа с таблици
С помощта на интерфейса Thrift можете да създавате или изтривате таблици. Нека да разгледаме кода на Python, който създава таблица:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
В този фрагмент сте създали обект Hbase.ColumnDescriptor. В този обект можете да зададете всички различни параметри за семейство колони. В този случай задавате само фамилното име на колоната.
Може да си спомните от предишните инструкции, че добавянето на файл Hbase.thrift към вашия проект често е полезно. Това е един от тези моменти:Можете да отворите Hbase.thrift и да намерите дефиницията на ColumnDescriptor с всичките й параметри и техните имена.
Можете да потвърдите, че таблица съществува, като използвате следния код:
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Този код получава списък с потребителските таблици, преглежда ги и маркира намерено като истина, ако таблицата бъде намерена.
Можете да изтриете таблица, като използвате следния код:
client.disableTable(tablename) client.deleteTable(tablename)
Не забравяйте, че в HBase трябва да деактивирате таблица, преди да я изтриете. Този код прави точно това.
Добавяне на редове с пестеливост
Thrift ни дава няколко начина да добавяме или актуализираме редове: един ред наведнъж или няколко реда наведнъж. Интерфейсът Thrift не използва същия обект Put като Java API. Тези промени се наричат мутации на редове и използват обектите Mutation и BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Всеки обект Mutation представлява промените в една колона. За да добавите или промените друга колона, просто трябва да добавите друг обект Mutation към списъка с мутации.
Когато приключите с добавянето на обекти Mutation, извиквате метода mutateRow. Този метод приема името на таблицата, ключа на реда и списъка с мутации като аргументи.
Добавянето на няколко реда наведнъж изисква няколко промени:
# Create a list of mutations per work of Shakespeare mutationsbatch = [] for line in shakespeare: rowkey = username + "-" + filename + "-" + str(linenumber).zfill(6) mutations = [ Hbase.Mutation(column=messagecolumncf, value=line.strip()), Hbase.Mutation(column=linenumbercolumncf, value=encode(linenumber)), Hbase.Mutation(column=usernamecolumncf, value=username) ] mutationsbatch.append(Hbase.BatchMutation(row=rowkey,mutations=mutations)) # Run the mutations for the work of Shakespeare client.mutateRows(tablename, mutationsbatch)
В този пример все още използвате обекта Mutation, но този път трябва да ги увиете в обект BatchMutation. Обектът BatchMutation ви позволява да зададете различен ключ за всеки списък с мутации. Вие също преминавате към метода mutateRows. Той отнема име на таблица и обект BatchMutation.
Получаване на редове с пестеливост
Използвайки метода getRow, можете да извлечете един ред въз основа на неговия ключ за ред. Това извикване връща списък с обекти TRowResult. Ето кода за получаване и работа с изхода:
rows = client.getRow(tablename, "shakespeare-comedies-000001") for row in rows: message = row.columns.get(messagecolumncf).value linenumber = decode(row.columns.get(linenumbercolumncf).value) rowKey = row.row
Стартирайте кода с заявка getRow. Това get ще върне реда с ключа „shakespeare-comedies-000001“. Тези редове ще се върнат като списък с TRowResult. С помощта на цикъл на редове преминавате през списъка с върнати редове.
За да получите стойността на колона, използвайте columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Не забравяйте да използвате правилния синтаксис за именуване.
Не забравяйте, че когато работите с двоични данни като цели числа, ще трябва да ги преобразувате от низ на Python в какъвто и да е тип. В този случай приемате низа и го правите цяло число с метода за декодиране.
Получаването на няколко реда наведнъж е много подобно на получаването на един ред. Ето кода:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
Вместо да посочите един ред, вие предавате списък с редове. Можете също да промените метода на getRows, който приема името на таблицата и списъка с редове като аргументи.
Връща се списък с обекти TRowResult и след това вие преглеждате списъка точно както в едноредовия код.
В следващата и последна инструкция ще научите как да използвате сканирания и ще получите въведение в някои съображения, когато избирате между REST и Thrift API за разработка.
Джеси Андерсън е инструктор за университета Cloudera.