2016-08-02 28 views
0

Mein Ziel ist es, räumliche Funktionalität in meinen Schweine-Skripts mit Tauben zu verwenden. Um die Tauben-Funktionen zu nutzen, registriere ich am Anfang drei JARs (pigeon-0.2.1.jar, esri-geometry-api-1.2.1.jar und jts-1.8.jar), die ohne Fehler und Warnungen laufen. Wenn ich in der Pig-Befehlszeile (grunt) pig-Befehle ausführe, ist alles in Ordnung (bis auf einige Verwarnungswarnungen, die sich auf andere Posts beziehen, die ignoriert werden können), aber sobald ich einen Taubenbefehl wie ST_MakePoint ausführen will, kommt ein Fehler auf :JARs mit Apache-Pig auf Hadoop nicht erkennen

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve ST_MakePoint using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] 

ich verwende: Ubuntu 14.04.4 LTS, Hadoop 2.7.1 (singlenode), Schwein 0.15.0

Vorschläge, wie dieses Problem beheben?

+0

Was ist ST_makepoint? Ist es ein Klassenname oder Paketname? – TKHN

+0

Entschuldigung. ST_MakePoint ist eine Funktion im Taubenglas. Und was ich mache, ist Punkte = LOAD 'Trajektorie.tsv' AS (Zeit: Datetime, Lat: Doppel, Lon: Doppel); s_points = FOREACH Punkte GENERATE ST_MakePoint (lat, lon) AS Punkt, Zeit; wie es in einigen Tauben-Tutorials gefunden wird. –

+0

Könnten Sie mir bitte sagen, in welcher Klasse Sie diese Funktion geschrieben haben? – Bector

Antwort

2

1. Weg:

Aufruf Syntax in Pig: packagename.ClassName(arg0...)

Quellcode Github:

package edu.umn.cs.pigeon; 

    import java.io.IOException; 

    import org.apache.pig.EvalFunc; 
    import org.apache.pig.data.DataByteArray; 
    import org.apache.pig.data.Tuple; 

    import com.esri.core.geometry.Point; 
    import com.esri.core.geometry.SpatialReference; 
    import com.esri.core.geometry.ogc.OGCPoint; 

    /** 
    * @author Ahmed Eldawy 
    * 
    */ 

    public class MakePoint extends EvalFunc<DataByteArray> { 

     @Override 
     public DataByteArray exec(Tuple input) throws IOException { 
     if (input.size() != 2) 
      throw new IOException("MakePoint takes two numerical arguments"); 
     double x = ESRIGeometryParser.parseDouble(input.get(0)); 
     double y = ESRIGeometryParser.parseDouble(input.get(1)); 
     Point point = new Point(x, y); 
     OGCPoint ogc_point = new OGCPoint(point, SpatialReference.create(4326)); 
     return new DataByteArray(ogc_point.asBinary().array()); 
     } 
    } 

So würde Syntax

sein
FOREACH points GENERATE edu.umn.cs.pigeon.MakePoint(X,Y) 

2. Weg: Verwenden Short Funktionsnamen

den Namen volle Funktion Schreiben zu vermeiden (Paket + Klassenname), können Sie die ‚pigeon_import.pig‘ Datei verwenden, die für alle Funktionen einen kurzen Namen erstellt. Sie können die Datei here herunterladen und neben Ihrem Pigeon-Skript platzieren. Um diese Datei in Ihr Skript zu laden, geben Sie die folgende Zeile an den Anfang Ihres Skripts aus. IMPORT 'pigeon_import.pig'; Danach können Sie den Umschlag Funktion als ST_MakePoint statt edu.umn.cs.pigeon.MakePoint dies hilft

Reference Blog

Hoffnung schreiben !!!

+0

Prost! Das ist es! Ich habe es nicht verstanden, denn hier wird die pigeon_import.pig nicht erwähnt, sondern benutzt: https://github.com/aseldawy/pigeon/blob/master/README.markdown –