2016-05-13 2 views
0

В настоящее время я работаю в Pig, и я пытаюсь проверить, присутствует ли значение поля (которое является chararray) в другом поле (также chararray). Вот пример.Apache Pig - Подстрока в другой строке

Файл t.txt:

1;This is a banana which is yellow.;Fruit;Banana 
2;This is not about fruit but about Apple Inc.;Company;Apple 

В приведенных выше примерах, я хотел бы проверить, если последнее поле (т.е. Banana и Apple) присутствует во втором поле (предложение). Вот мой свинья сценарий до сих пор:

a = LOAD 't.txt' using PigStorage(';') AS (id:chararray, sentence:chararray, kind:chararray, search:chararray); 

b = FOREACH a GENERATE id, LOWER(sentence) as sent:chararray, kind, LOWER(search) as srch:chararray; 

c = FILTER b BY sent MATCHES '.* srch .*'; 

Цели я пытаюсь достичь, чтобы получить биграммы окружающих слова для поиска. Чтобы дать конкретный пример, это то, что я ищу (или в другой форме):

(1,Fruit,{(a, banana),(banana, which}) 
(2,Company,{(about, apple),(apple, inc.}) 

Итак, мой вопрос: как я могу воспользоваться поиском поля из схемы, чтобы соответствовать полю предложения от схема?

+0

Итак, вам нужно предложение из t.txt, которое соответствует типу и поиску из второй схемы? Так что искать предложение со всеми словами или только одним словом из любого из кортежей из списка. –

+0

Итак, чтобы привести пример: из каждой строки я хочу извлечь значение (содержащееся в поле «поиск») из предложения (содержащегося в поле «предложение»). Он очень похож на ситуацию, когда вы используете MATCHES, но с заданным шаблоном. Однако в качестве шаблона здесь я хотел бы использовать значение, содержащееся в поле «поиск» вместо заданного шаблона. Так сказать, шаблон динамичен и изменяется для каждой строки. –

ответ

2

Используйте UDF. Передайте предложение и элемент поиска в UDF. В UDF разделите предложение на слова и повторите по словам. Если слово совпадает, то получите слово до и после элемента поиска.

PigScript

REGISTER GetSurroundingWords.jar; 
DEFINE GetSurroundingWords com.mypackages.GetSurroundingWords(); 

A = LOAD 'test11.txt' using PigStorage(';') AS (id:chararray, sentence:chararray, kind:chararray, search:chararray); 
B = FOREACH A GENERATE id, LOWER(sentence) as sent:chararray, kind, LOWER(search) as srch:chararray; 
C = FOREACH B GENERATE id,kind,GetSurroundingWords(sent,srch); 
DUMP C; 

Выход

Output

Java UDF

package com.mypackages; 

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class GetSurroundingWords extends EvalFunc<String> 
{ 
    public String exec(Tuple input) throws IOException 
    { 
     if(input != null && input.size() != 0) 
     { 
      String sInputString = input.toString(); 
      String sOutputString = ""; 
      try 
      { 
       if(sInputString != null && !sInputString.isEmpty()) 
       { 
        String [] sInputStringItems = sInputString.split(","); 
        String sSentence = sInputStringItems[0].replace('(', ' ').trim(); 
        String [] sWords = sSentence.split(" "); 
        String sSearchItem = sInputStringItems[1].replace(')',' ').trim(); 

        for(int iIndex = 0;iIndex < sWords.length;iIndex ++) 
        { 
         if(sWords[iIndex].equals(sSearchItem)) 
         { 
          try 
          { 
           sOutputString = "(" + sWords[--iIndex] + "," + sSearchItem + ")"; 
          }catch(Exception ex) 
          { 
           sOutputString = "(" + sSearchItem + ")"; 
          } 

          int iNextItem = iIndex + 2; 
          try 
          { 
           sOutputString = sOutputString + "," + "(" + sSearchItem + "," + sWords[iNextItem] + ")"; 
          }catch(Exception ex) 
          { 
           sOutputString = sOutputString + "," + "(" + sSearchItem + ")"; 
          } 
          return sOutputString; 
         } 
        }   
       } 
       else 
       { 
        return null; 
       } 
      } 
      catch(Exception ex) 
      { 
       return null; 
      } 
      return sOutputString; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 
+0

Отлично работает, спасибо за помощь! –

+1

@RobinTrietsch Прохладный, вам, возможно, придется немного оптимизировать код для java UDF, особенно для конкатенации строк, цикла и т. Д. Я не эксперт в Java –

+0

. Я рассмотрю это, хотя я не эксперт по Java , По крайней мере, у меня есть твердая отправная точка благодаря вам! –

Смежные вопросы