2016-05-13 18 views
0

Momentan arbeite ich in Pig und ich versuche zu überprüfen, ob ein Feldwert (der ein chararray ist) in einem anderen Feld (auch ein chararray) vorhanden ist. Hier ist ein Beispiel.Apache Pig - Teilstring in anderen String

Datei t.txt:

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

In den obigen Beispielen, würde ich prüfen möchte, ob das letzte Feld (das heißt Banana und Apple) in dem zweiten Bereich (der Satz). Hier ist mein Schwein Skript so weit:

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 .*'; 

Das Ziel, das ich bin versucht zu erreichen, um die Bigramme zu erhalten das Suchwort umgeben. Um ein konkretes Beispiel zu geben, das ist, was ich suche (oder in einer anderen Form):

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

Also, meine Frage ist: Wie kann ich die Feldsuche aus dem Schema verwenden, um von dem Feld Satz Übereinstimmen das Schema?

+0

Sie wollen also einen Satz aus t.txt, der mit art übereinstimmt und nach dem zweiten Schema sucht? So suchen Sie nach einem Satz mit allen Wörtern oder nur einem Wort aus einem der Tupel aus der Liste. –

+0

Um ein Beispiel zu geben: Ich möchte aus jeder Zeile einen Wert (im Feld "Suche" enthalten) aus einem Satz (im Feld "Satz" enthalten) extrahieren. Es ist sehr ähnlich der Situation, in der Sie MATCHES verwenden, aber mit einem bestimmten Muster. Als Muster möchte ich hier jedoch den im Feld "Suchen" enthaltenen Wert anstelle eines gegebenen Musters verwenden. Das Muster ist also dynamisch und ändert sich für jede Zeile. –

Antwort

2

Verwenden Sie eine UDF. Übergeben Sie den Satz und das Suchelement an die UDF. In der UDF teilen Sie den Satz in Wörter und iterieren über die Wörter. Wenn das Wort übereinstimmt, dann erhalten Sie das Wort vor und nach dem Suchbegriff.

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; 

Ausgabe

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

Funktioniert gut, danke für Ihre Hilfe! –

+1

@RobinTrietsch Cool, müssen Sie möglicherweise einige kleinere Code-Optimierungen auf die Java-UDF, vor allem die String-Verkettung, Schleife etc.Ich bin kein Experte in Java –

+0

Ich werde das untersuchen, obwohl ich auch kein Java-Experte bin . Zumindest habe ich dank dir einen soliden Startpunkt! –