Java 将历元转换为日期和时间-HADOOP
我正在努力学习hadoop(mapreduce)。我有一个mapper方法,其中我使用Date类来解析;时代;数据集中以毫秒表示的字段。数据集由2015年5月25日至2015年8月10日之间的历元组成 我想将历元转换为日期/时间,但只返回2015年6月5日至2015年6月15日之间历元的日期/时间 以下是我迄今为止所取得的成就。下面的代码生成以下内容: 输出: 2015年5月25日 2015年6月25日 等 期望输出 2015年6月5日// 2015年6月6日53 2015年6月7日41 等 制图员Java 将历元转换为日期和时间-HADOOP,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在努力学习hadoop(mapreduce)。我有一个mapper方法,其中我使用Date类来解析;时代;数据集中以毫秒表示的字段。数据集由2015年5月25日至2015年8月10日之间的历元组成 我想将历元转换为日期/时间,但只返回2015年6月5日至2015年6月15日之间历元的日期/时间 以下是我迄今为止所取得的成就。下面的代码生成以下内容: 输出: 2015年5月25日 2015年6月25日 等 期望输出 2015年6月5日// 2015年6月6日53 2015年6月7日41 等 制
public class mapper extends Mapper<Object, Text, Text, IntWritable> {
private Text data = new Text();
private IntWritable one = new IntWritable(1);
String time;
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] userinput = value.toString().split(";");
try{
LocalDateTime epoch = LocalDateTime.ofEpochSecond(Long.parseLong(userinput[0])/1000, 0, ZoneOffset.UTC);
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM.yyyy");
time = epoch.format(f);
data.set(time);
context.write(data,one);
}
catch(Exception e){
System.out.println("Error: " + e);
}
}
}
公共类映射器扩展映射器{
私有文本数据=新文本();
私有IntWritable one=新的IntWritable(1);
串时间;
公共void映射(对象键、文本值、上下文上下文)引发IOException、InterruptedException{
String[]userinput=value.toString().split(;);
试试{
LocalDateTime epoch=LocalDateTime.ofepochs秒(Long.parseLong(userinput[0])/1000,0,ZoneOffset.UTC);
DateTimeFormatter f=模式的DateTimeFormatter.of(“dd.MM.yyyy”);
时间=历元格式(f);
数据集(时间);
写(数据,一个);
}
捕获(例外e){
System.out.println(“错误:+e”);
}
}
}
减速器
public class reducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable one = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum+=value.get();
}
one.set(sum);
context.write(key, one);
}
公共类reducer扩展reducer{
私有IntWritable one=新的IntWritable();
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum+=value.get();
}
一、集合(总和);
上下文。写(键,一);
}
}所以您只关心这个括号内的数据<代码>2015年5月25日[2015年6月5日…2015年6月15日]2015年8月10日 如果这就是您所需要的,那么它就像
If
语句一样简单
我对Java8不太熟悉,但请检查一下
公共类映射器扩展映射器{
私有文本数据=新文本();
私有静态最终IntWritable ONE=新的IntWritable(1);
私有静态最终DateTimeFormatter FMT=模式的DateTimeFormatter.of(“dd.MM.yyyy”);
串时间;
//界定边界
私有LocalDateTime start=LocalDateTime.parse(“2015.06.05”,FMT);
私有LocalDateTime end=LocalDateTime.parse(“2015.06.15”,FMT);
@凌驾
公共void映射(对象键、文本值、上下文上下文)引发IOException、InterruptedException{
String[]userinput=value.toString().split(;);
试一试{
Long ms=Long.parseLong(userinput[0])/1000;
LocalDateTime inputEpoch=LocalDateTime.ofepochs秒(毫秒,0,ZoneOffset.UTC);
//过滤你的数据
if(inputeoch.isAfter(开始)和&inputeoch.isBefore(结束)){
数据集(inputEpoch.format(FMT));
写(数据,一个);
}
}捕获(…){}
}
}
Hi,代码只是我的mapper类的一个片段。我有一个映射器,一个减速器和一个驱动程序类。你能告诉我使用哪种日期模式吗?很多人感谢我,我关于Hadoop的观点仍然是正确的。编写一个单元测试或常规Java程序来识别日期范围,然后将条件放入映射器中,以提取您关心的日期范围子集。我说得对,我有日期格式的句点。我已更新了我的代码。请参阅更新的代码段。如何访问日期范围?你能给我提供一个如何获取日期范围的例子吗?将你的输入解析为毫秒历元,然后它就像if(startDate)一样简单,我修改了我的类并应用了你的建议,但我得到了两个错误。方法ChronoLocalDateTime.isAfter(ChronoLocalDateTime)不适用,if(inputEpoch.isAfter(start)&&inputEpoch.isBefore(end)){[javac]^[javac]方法ChronoLocalDateTime.isBefore(ChronoLocalDateTime)不适用。(参数不匹配;LocalDate无法转换为ChronoLocalDateTime)需要LocalDateTime
。请重试。
public class mapper extends Mapper<Object, Text, Text, IntWritable> {
private Text data = new Text();
private static final IntWritable ONE = new IntWritable(1);
private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy");
String time;
// Define the boundaries
private LocalDateTime start = LocalDateTime.parse("2015.06.05", FMT);
private LocalDateTime end = LocalDateTime.parse("2015.06.15", FMT);
@Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] userinput = value.toString().split(";");
try {
Long ms = Long.parseLong(userinput[0])/1000;
LocalDateTime inputEpoch = LocalDateTime.ofEpochSecond(ms, 0, ZoneOffset.UTC);
// Filter your data
if (inputEpoch.isAfter(start) && inputEpoch.isBefore(end)) {
data.set(inputEpoch.format(FMT));
context.write(data,ONE);
}
} catch (...) { }
}
}