在 Hadoop 上使用 Apache-Pig 无法识别 JAR

Not recognizing JARs using Apache-Pig on Hadoop

我的目标是在我的 pigeon 脚本中使用空间功能。为了使用 pigeon-functions,我在以下位置注册了三个 JAR(pigeon-0.2.1.jar、esri-geometry-api-1.2.1.jar 和 jts-1.8.jar)开头,运行s 没有错误和警告。 当我在 pig 命令行 (g运行t) 中 运行 pig 命令时,一切都很好(除了一些 deprication 警告,但参考其他帖子这可以被忽略)但是一旦我想 运行 类似 ST_MakePoint 的 pigeon 命令出现错误:

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.]

我正在使用:Ubuntu 14.04.4 LTS、Hadoop 2.7.1(单节点)、pig 0.15.0

关于如何解决这个问题有什么建议吗?

第一种方式:

Pig 中的调用语法:packagename.ClassName(arg0...)

源代码来自 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());
      }
    }

所以语法是

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

第二种方式: 使用短函数名

为了避免写完整的函数名(包 + class 名称),您可以使用 'pigeon_import.pig' 文件为所有函数创建一个短名称。您可以下载文件 here 并将其放在您的 Pigeon 脚本旁边。要将此文件加载到脚本中,请将以下行发送到脚本的开头。 进口'pigeon_import.pig'; 之后,您可以将包络函数写为 ST_MakePoint 而不是 edu.umn.cs.pigeon.MakePoint

Reference Blog

希望对您有所帮助!!!