如何从 Hadoop 中的地图程序中输出具有列表等数据结构的自定义类

Posted

技术标签:

【中文标题】如何从 Hadoop 中的地图程序中输出具有列表等数据结构的自定义类【英文标题】:How do i output Custom Classes having lists etc data structure from a Map Program in Hadoop 【发布时间】:2015-05-12 18:24:53 【问题描述】:

我是 Hadoop 和 Map Reduce 编程的新手。我有一个数据集,其中包含来自 943 个用户的电影评分。每个用户最多可对 20 部电影进行评分。现在我希望我的 Mapper 的输出是用户 ID 和一个自定义类,该类将有两个电影列表(用户评分的电影 id)和评分(每部电影的评分)。但我不确定在这种情况下如何从 Map 方法输出这些值。代码 sn-ps 如下:-

public class UserRatings implements WritableComparable
private List<String> movieId;
private List<String> movieRatings;
public List<String> getMovieRatings() 
    return movieRatings;


public void setMovieRatings(List<String> movieRatings) 
    this.movieRatings = movieRatings;


public List<String> getMovieId() 
    return movieId;


public void setMovieId(List<String> movieId) 
    this.movieId = movieId;


@Override
public int compareTo(Object o) 
    return 0;


@Override
public void write(DataOutput dataOutput) throws IOException 
    dataOutput.write


@Override
public void readFields(DataInput dataInput) throws IOException 


这里是地图方法

public class GenreMapper extends Mapper<LongWritable,Text,Text,IntWritable> 

public void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException
   // Logic for parsing the file and exracting the data. Can be ignored...
    String[] input = value.toString().split("\t");
    Map<String,UserRatings> mapData = new HashMap<String,UserRatings>();
    for(int i=0;i<input.length;i++)
        List<String> tempList = new ArrayList<String>();
        UserRatings userRatings = new UserRatings();
        tempList.add(input[3]);
        List<String> tempMovieId = new ArrayList<String>();
        tempMovieId.add(input[1]);
        for(int j=4;j<input.length;j++)
            if(input[i].contentEquals(input[j]))
                   tempMovieId.add(input[j+1]);
                   tempList.add(input[j+3]);
                    j = j+4;
            

        
        userRatings.setMovieId(tempMovieId);
        userRatings.setMovieRatings(tempList);
        mapData.put(input[i],userRatings);
    
   // context.write();


【问题讨论】:

【参考方案1】:

我认为您错过了映射器功能的重点。映射器不应在其输出上发出列表。 mapper 的关键点是生成一个reducer 将捕获的元组,并针对该键进行必要的计算以产生良好的输出,鉴于此,mapper 的输出格式应尽可能简单。

在这种情况下,我认为正确的方法是在映射器上发出一个键值对:

user_id、custom_class

自定义类必须有一个movie_id 和一个评级,而不是一个列表。更具体地说,我需要知道你想要这个 map reduce cicle 的最终结果是什么。请注意,如果需要,您可以对第一个结果运行第二个 map reduce。

【讨论】:

【参考方案2】:

您可以考虑使用Text 和MapWritable 作为映射器类的键值对。

这里用户ID是key(文本),由电影ID和用户评分组成的Mapwritable是value对象。

Mapwritable 值对象应以 MovieId 为键,用户评分为值。

考虑这个示例代码sn-p,

MapWritable result=new MapWritable();
result.put(new Text("movie1") , new Text("user1_movie1_rating"));
result.put(new Text("movie2") , new Text("user1_movie2_rating"));

Text key = new Text("user_1_id");

context.write(key, result);

希望这会有所帮助:) ..

【讨论】:

以上是关于如何从 Hadoop 中的地图程序中输出具有列表等数据结构的自定义类的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用Python API Pydoop得到Hadoop集群中的实际数据(地图后减少)?

如何编写“仅地图”hadoop 作业?

如何从数据库中的地图上绘制瓷砖?

如何从地图列表中逐列检索飞镖中的数据?

如何在地图上显示数据库中存储的位置?

如何将地图列表中的项目显示到列表视图中