我的目标是在我的鸽子猪脚本中使用空间功能。为了使用鸽子函数,我在开始时注册了三个JAR(鸽子-0.2.1.jar,esri-几何学-api-1.2.1.jar和jts-1.8.jar),运行时没有错误和警告。当我在猪命令行(grunt)中运行猪命令时,一切都很好(除了一些指示性警告,但引用其他帖子时,这是可以忽略的),但只要我想运行像ST_MakePoint这样的鸽子命令,就会出现一个错误:
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 (singlenode),pig 0.15.0
对如何解决这个问题有什么建议吗?
发布于 2016-08-03 12:25:35
第一条路:
在猪中调用语法: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) 2 Way: 使用简短的函数名
为了避免编写完整的函数名(包+类名),可以使用“pigeon_import.pig”文件为所有函数创建一个简短的名称。您可以下载文件这里并将其放在鸽子脚本旁边。若要将此文件加载到脚本中,请将以下行发送到脚本的开头。导入‘鸽子_IMPO.Pig’;之后,您可以将信封函数写成ST_MakePoint而不是edu.umn.cs.pigeon.MakePoint
参考博客
希望这会有帮助!
https://stackoverflow.com/questions/38719435
复制相似问题