Mahout:读取自定义输入文件

时间:2011-08-26 19:28:38

标签: java hadoop mahout

我正在玩Mahout并发现FileDataModel接受格式为

的数据
     userId,itemId,pref(long,long,Double).

我有一些格式为

的数据
     String,long,double 

在Mahout上使用此数据集的最佳/最简单方法是什么?

3 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是创建FileDataModel的扩展名。您需要覆盖readUserIDFromString(String value)方法才能使用某种解析器进行转换。正如肖恩建议的那样,你可以使用IDMigrator的一种实现方式。

例如,假设您已初始化MemoryIDMigrator,则可以执行此操作:

@Override
protected long readUserIDFromString(String stringID) {
    long result = memoryIDMigrator.toLongID(stringID); 
    memoryIDMigrator.storeMapping(result, stringID);
    return result;
}

这样你也可以使用memoryIDMigrator进行反向映射。如果你不需要它,你可以按照它们在实现中完成的方式对它进行哈希处理(它在AbstractIDMigrator中)。

答案 1 :(得分:3)

userId和itemId可以是字符串,因此this is the CustomFileDataModel会将您的字符串转换为整数,并将地图(String,Id)保留在内存中;在建议之后你可以从id获得字符串。

答案 2 :(得分:1)

假设您的输入适合内存,请循环播放。跟踪字典中每个字符串的ID。如果它不适合内存,请使用sort然后分组来实现相同的想法。

在python中:

导入sys

import sys

next_id = 0
str_to_id = {}
for line in sys.stdin:
    fields = line.strip().split(',')
    this_id = str_to_id.get(fields[0])
    if this_id is None:
        next_id += 1
        this_id = next_id
        str_to_id[fields[0]] = this_id
    fields[0] = str(this_id)

    print ','.join(fields)