- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我将 Cloudera VM 与 Centos 一起使用,并设置了单个 Hadoop 集群。它使用 Eclipse Luna。
我有一个为与 Pig 一起使用而编写的 UDF。这是我第一次为 Pig 编写 UDF。以前的 Pig 脚本在没有 UDF 的情况下运行良好。当我运行这个 pig 脚本时,出现以下错误:
Failed to generate logical plan. Nested exception: org.apache.pig.backend.executionengine.ExecException: ERROR 1070: Could not resolve EasyDates.EasyDateMethods.exec using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.]
此错误发生在以“CALC_UR_DAYS_BETWEEN”开头的 pig 脚本中。见下文。
我花了 3-4 个小时在互联网上搜索(和测试),他们都指- 正确设置类路径,- 确保你注册了你的 UDF,- 确保 jar 文件名与包名相同,- 确保包名称是工作路径中的一个目录,并且与包同名。
我已经完成了所有这些,但我仍然收到错误。
据我所知,所有内容都已正确命名且应位于:
几个小时后我已经用完了这些帖子。我找不到其他任何东西可以尝试。非常感谢任何其他见解!
Java 源代码:
package EasyDates;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.util.WrappedIOException;
public class EasyDateMethods extends EvalFunc <String> {
public String exec(Tuple input) throws IOException {
if (input == null || input.size() == 0)
return "0";
try{
Date date1;
Date date2;
String strDiff="0";
int intDiff = 0;
//Get the two string dates from the tuple:
String strDate1 = (String)input.get(0);
String strDate2 = (String)input.get(1);
//Convert them to Dates
date1 = stringToDate(strDate1);
date2 = stringToDate(strDate2);
//The the date difference:
intDiff = getDaysBetween(date1, date2);
//Since I must return the same data type as I call for this Pig method, this converts the
//difference in days to a string.
return Integer.toString(intDiff);
}catch(Exception e){
throw WrappedIOException.wrap("Caught exception processing input row ", e);
}
}
private Date stringToDate(String theDateString) {
//Make sure the Pig script formats the date format this way or whatever format you choose.
//Just make sure they agree.
SimpleDateFormat dateFormatter = new SimpleDateFormat ( "dd-MMM-yyyy" );
String dateInString = "12-May-2014";
Date theDate;
java.util.Date dateObject = null;
try {
dateObject = dateFormatter.parse ( theDateString );
System.out.println( dateObject );
System.out.println( dateFormatter.format ( dateObject ) );
//theDate = dateFormatter.format ( dateObject );
} catch ( Exception e) {
System.out.println( e.getMessage() + " " + e.getStackTrace() );
};
return dateObject ;
}
static int getDaysBetween(Date curDate, Date prevDate) {
//Precondition: the difference in days between the current meter read date and the last one is not known
//Postcondition: the difference in days between the current meter read date and the last one is known
Calendar currentDate = Calendar.getInstance();
Calendar previousDate = Calendar.getInstance();
currentDate.setTime(curDate);
previousDate.setTime(prevDate);
int theDiffinDays = 0;
int theDiffinYears = 0;
int currentDay;
int previousDay;
int currentYear;
int previousYear;
try {
currentDay = currentDate.get(Calendar.DAY_OF_YEAR);
System.out.println("currentDay is " + currentDay);
previousDay = previousDate.get(Calendar.DAY_OF_YEAR);
System.out.println("previousDay is " + previousDay);
currentYear = currentDate.get(Calendar.YEAR);
System.out.println("currentYear is " + currentYear);
previousYear = previousDate.get(Calendar.YEAR);
System.out.println("previousYear is " + previousYear);
if (currentYear == previousYear) {
theDiffinDays = currentDay - previousDay;
}
else
{
theDiffinYears = currentYear - previousYear;
//This assumes 2 contiguous years, eg 2016 and 2017; so this wouldn't work if the diff in years is greater than 1
if (isLeapYear(previousYear)) {
//The following has not been corrected for leap year:
//If the previous year is a leap year
theDiffinDays = 366 - previousDay + currentDay;
}
else {
//If the current year is a leap year or neither year is a leap year: (because the day of year should be inherent whether leap or not)
theDiffinDays = 365 - previousDay + currentDay;
}
}
//return theDiffinDays;
}
catch (Exception ex){
System.out.println(ex.getMessage() + " " + ex.getStackTrace());
}
return theDiffinDays;
}
private static boolean isLeapYear(int theYear){
//Precondition: the year is not designated as a leap year or not
boolean ans = false;
try {
switch (theYear){
case 2004: ans = true;
break;
case 2008: ans = true;
break;
case 2012: ans = true;
break;
case 2016: ans = true;
break;
case 2020: ans = true;
break;
case 2024: ans = true;
break;
case 2028: ans = true;
break;
case 2032: ans = true;
break;
case 2036: ans = true;
break;
case 2040: ans = true;
break;
case 2044: ans = true;
break;
case 2048: ans = true;
break;
default: ans = false;
}
}
catch (Exception ex){
System.out.println(ex.getMessage() + " " + ex.getStackTrace());
}
return ans;
}
}
pig 脚本:
--Simple Pig script to read in a file with dates, and pass the dates to the EasyDate class
REGISTER /home/cloudera/data/EasyDates/EasyDates.jar;
DEFINE DaysBetween EasyDates.EasyDateMethods;
----------------------------------------------------Load the file--------------------------------------------
--The file needs two different dates in one row for this test
devicePageCountAll = LOAD 'Data_For_Test_Jar.txt' USING PigStorage('\t')
AS (
account_code:chararray,
serial_number:chararray,
reported_date:chararray,
reported_date2:chararray);
--dump devicePageCountAll;
--------------------------------------------------Get the date difference in days and store the result-----------------
devicePageCountAll2 = foreach devicePageCountAll {
CALC_UR_DAYS_BETWEEN = DaysBetween((ToString(REPLACE(reported_date, '\\"', ''), 'yyyy-MM-dd')), (ToString(REPLACE(reported_date2, '\\"', ''), 'yyyy-MM-dd')));
generate
account_code,
serial_number,
reported_date,
reported_date2,
(CALC_UR_DAYS_BETWEEN > 15000 ? 0 : CALC_UR_DAYS_BETWEEN) AS days_since_last_reported;
}
dump devicePageCountAll2;
谢谢!
最佳答案
代替这个
DEFINE DaysBetween EasyDates.EasyDateMethods;
尝试
DEFINE DaysBetween EasyDates.EasyDateMethods();
关于hadoop - Pig 的 UDF 错误 - 无法使用导入解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35854142/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!