【问题标题】:Mahout : To read a custom input fileMahout :读取自定义输入文件
【发布时间】:2011-11-04 19:04:50
【问题描述】:

我在玩 Mahout,发现 FileDataModel 接受格式的数据

     userId,itemId,pref(long,long,Double).

我有一些格式的数据

     String,long,double 

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

【问题讨论】:

    标签: java hadoop mahout


    【解决方案1】:

    假设您的输入适合内存,循环遍历它。跟踪字典中每个字符串的 ID。如果它不适合内存,请使用 sort 然后 group by 来完成相同的想法。

    在python中:

    导入系统

    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)
    

    【讨论】:

    • Mahout 中有一个组件可以自动执行这种操作,称为 IDMigrator,但我也建议在外部转换为数字 ID。
    【解决方案2】:

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

    例如,假设您有一个已初始化的MemoryIDMigrator,您可以这样做:

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

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

    【讨论】:

      【解决方案3】:

      userId 和 itemId 可以是字符串,所以 this is the CustomFileDataModel 会将您的字符串转换为整数并将映射 (String,Id) 保存在内存中;推荐后,您可以从 id 获取字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多