我的目标是通过 pigeon 在我的 pig 脚本中使用空间功能。为了使用 pigeon-functions,我在开始时注册了三个 JAR(pigeon-0.2.1.jar、esri-geometry-api-1.2.1.jar 和 jts-1.8.jar),它们运行时没有错误和警告。 当我在 pig 命令行(grunt)中运行 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)
第二种方式: 使用简短的函数名称
为避免编写完整的函数名称(包+类名称),您可以使用“pigeon_import.pig”文件为所有函数创建一个短名称。您可以下载文件 here并将其放在您的 Pigeon 脚本旁边。要将此文件加载到脚本中,请将以下行发送到脚本的开头。 导入 'pigeon_import.pig'; 之后,您可以将信封函数写为 ST_MakePoint 而不是 edu.umn.cs.pigeon.MakePoint
希望这有帮助!!!
关于hadoop - 在 Hadoop 上使用 Apache-Pig 无法识别 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719435/