Абстрактният клас StoreFunc има основните методи за съхраняване на данни и за повечето случаи на употреба би трябвало да е достатъчно да се разшири. Има незадължителен интерфейс, който може да се приложи за постигане на разширена функционалност:
StoreMetadata
Този интерфейс има методи за взаимодействие със системи с метаданни за съхраняване на схема и статистика. Този интерфейс не е задължителен и трябва да се прилага само ако метаданните трябва да се съхраняват.
Методите, които трябва да бъдат заменени в StoreFunc, са обяснени по-долу:
разлика между претоварването на метода и заместването в java
getOutputFormat ():
Този метод ще бъде извикан от Pig, за да получи OutputFormat, използван от Storer. Методите в OutputFormat ще бъдат извикани от Pig по същия начин и в същия контекст като от Hadoop в Java програма за намаляване на картата. Ако OutputFormat е пакетиран от Hadoop, внедряването трябва да използва новия API, базиран на org.apache.hadoop.mapreduce. Ако това е персонализиран OutputFormat, той трябва да бъде реализиран с помощта на новия API под org.apache.hadoop.mapreduce. Методът checkOutputSpecs () на OutputFormat ще бъде извикан от pig, за да провери местоположението на изхода отпред. Този метод също ще бъде извикан като част от последователността на извикванията на Hadoop, когато заданието бъде стартирано. Така че внедряванията трябва да гарантират, че този метод може да бъде извикан няколко пъти, без несъответстващи странични ефекти.
setStoreLocation ():
Този метод се извиква от Pig, за да съобщи местоположението на магазина на склада. Хранилището трябва да използва този метод, за да предаде същата информация на основния OutputFormat. Този метод се извиква няколко пъти от Pig. Внедряванията трябва да вземат под внимание, че този метод се извиква многократно и трябва да гарантира, че няма противоречиви странични ефекти поради многобройните повиквания.
Подготовка за писане ():
В новия API записването на данните става чрез OutputFormat, предоставен от StoreFunc. В pripremToWrite () RecordWriter, свързан с OutputFormat, предоставен от StoreFunc, се предава на StoreFunc. След това RecordWriter може да се използва от изпълнението в putNext (), за да напише кортеж, представляващ запис на данни по начин, очакван от RecordWriter.
putNext ():
Значението на putNext () не се е променило и се извиква от Pig runtime, за да напише следващия набор от данни - в новия API това е методът, при който реализацията ще използва основния RecordWriter за изписване на Tuple out.
Реализации по подразбиране в StoreFunc:
setStoreFuncUDFContextSignature ():
Този метод ще бъде извикан от Pig както отпред, така и отзад, за да предаде уникален подпис на Съхранителя. Подписът може да се използва за съхраняване на всякаква информация в UDFContext, която Съхраняващият трябва да съхранява между различни извиквания на методи в предния и задния край. Реализацията по подразбиране в StoreFunc има празно тяло. Този метод ще бъде извикан преди всички други методи.
relToAbsPathForStoreLocation ():
Времето за изпълнение на свиня ще извика този метод, за да позволи на хранилището да преобразува относително местоположение на магазина в абсолютно местоположение. В StoreFunc е осигурено изпълнение, което обработва това за базирани на FileSystem местоположения.
checkSchema ():
Функция Store трябва да внедри тази функция, за да провери дали дадена схема, описваща данните, които трябва да бъдат записани, е приемлива за нея. Реализацията по подразбиране в StoreFunc има празно тяло. Този метод ще бъде извикан преди всякакви повиквания към setStoreLocation ().
Пример за изпълнение:
Реализацията на хранилището в примера е хранилище за текстови данни с разделител на редове като ‘
‘И‘ ‘като разделител на поле по подразбиране (който може да бъде заменен чрез предаване на различен разделител на поле в конструктора) - това е подобно на текущия склад на PigStorage в Pig. Реализацията използва съществуващ поддържан от Hadoop OutputFormat - TextOutputFormat като основен OutputFormat.
публичен клас SimpleTextStorer разширява StoreFunc {защитен RecordWriter писател = нула private byte fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (String delimiter) {this ( ) if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if (delimiter.length ()> 1delimiter.charAt (0) == '') {switch ( delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x': fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () case case ' u ': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: хвърли нов RuntimeException (' Неизвестен разделител '+ разделител)}} else {хвърли нов RuntimeException (' PigStorage делиметър трябва да бъде единичен знак ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) хвърля IOException {int sz = f.size () for (int i = 0 iИмате въпрос към нас? Моля, споменете ги в раздела за коментари и ние ще се свържем с вас.
Подобни публикации: