java读取movielens数据txt

本文介绍了如何使用Java处理 Movielens 数据集,包括字符串操作、文件读取、数据解析和序列化。接着,通过实例展示了如何利用Spark的Java API读取文件并转换为RDD,以及创建DataFrame进行展示。内容涵盖了基于标题的相似性、word2vector、ALS等推荐方法,同时提及了NLP在推荐系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各位好,我是菜鸟小明哥,movielens数据是常见的推荐方面的开源数据集,另一个推荐方面的数据集是新闻MIND本文将从movielens再次出发,做基础的推荐方法,比如基本的基于标题的相似性,word2vector,ALS,等等,以及NLP方面的推荐

For deep learning QQ Second Group 629530787 

I'm here waiting for you

如题,本文只说读取txt文件,java读取及spark读取为rdd

1,测试string基本属性,这样就可以与py对齐了

//相加及打印字符char
String ksc="m1k3jd";//new String("939dkkw")
        String bsc ="te102id0";
        String vsc = ksc + bsc;
        System.out.println(vsc);
        for (int ii=0;ii<vsc.length();ii++)
            System.out.println(vsc.charAt(ii));
//相加后返回
public static String addString(String a, String b) {
//        return new String(a+b);
        return a+b;
    }
//这两种方法都可以,没发现差别

2,java一般读取方法

鉴于java没有办法设置默认参数,就不再重载设置了(再写一遍这个函数),因此不要默认参数了。另外,读取文件可能会有异常(1,找不到文件;2,解码错误),java要求

java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出

public static void readTXT(String file,String encoding) {
        File fil=new File(file);
        try {
            InputStreamReader reader = new InputStreamReader(new FileInputStream(fil), encoding);
            BufferedReader buffReader = new BufferedReader(reader);
            if (fil.isFile()&&fil.exists()){
                String line;
                while ((line= buffReader.readLine())!=null){
                    System.out.println(line);
                }
            }
        }catch (FileNotFoundException e){
            System.out.println("file not found");
        }catch (UnsupportedEncodingException e) {
            System.out.println("encoding is not right");
            //throw new RuntimeException(e);
        } catch (IOException e) {
            System.out.println("reading file ups error");
            //throw new RuntimeException(e);
        }
    }

当我采用UTF-8进行解码发现并没有报错,我擦,而py则不行,需要"ISO-8859-1"解码。

将上面的打印行注释,其他不变,结果发现并没有上面的catch抛出,而且行数相同。都是3883

3,解析每行的数据:一般方法

最笨我直接split也就行了啊,每行存一个String数组,OJBK

        String vsc3=new String("6::Heat (1995)::Action|Crime|Thriller");
        String res[]=vsc3.split("::");
        for (String resi :res)
            System.out.println(resi);

4, 序列化接口Serializable(可以继承这个,也可自己写)

一般是读取文件(需要预先知道数据存储格式/形式)或者保存数据,转换数据格式之用。

上面2中只是读取了一下,并没有转换格式,下面采用读取每行的细节,

public static class Serialize{
        private int movieId;
        private String title;
        private String tag;
        public Serialize(){
        }//构造函数
        public Serialize(int movieId,String title,String tag){
            this.movieId=movieId;
            this.title=title;
            this.tag=tag;
        }

        public static Serialize parseSerialize(String string){
            String[] str3=string.split("::");
            int movieId;
            String title,tag;
            movieId = Integer.parseInt(str3[0]);
            title=str3[1];
            tag=str3[2];
            return new Serialize(movieId,title,tag);
        }
    }

使用记录:

Serialize example = Serialize.parseSerialize(vsc3);
        System.out.println(example.movieId+","+example.title+","+example.tag);

5,spark-rdd读取

注意设置以下环境不然报错,我的是java-18 MacPro,Idea C

螺丝刀那里进去,modify options add VM options,不设置就会报错。

 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED

代码如下:也参考了这个资料

4中写的class没有问题,但在spark中如果需要读取列就不行了,因为没有写读取列的方法。如下:不写这方法,spark-rdd读取不到数据

public int getMovieId3(){
            return movieId;
        }

        public String getTitle3(){
            return title;
        }

        public String getTag3(){
            return tag;
        }

spark读取txt文件代码:

SparkConf conf = new SparkConf().setAppName("JavaALS001").setMaster("local[*]");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> distFile = sc.textFile(file);
        JavaRDD<Serialize> rdd = distFile.map(new Function<String,Serialize>(){
            public Serialize call(String s) {
                return Serialize.parseSerialize(s);
            }
        });
        SQLContext sqlContext = new SQLContext(sc);
        Dataset<Row> df = sqlContext.createDataFrame(rdd,Serialize.class);
        df.show(12);

结果如下:列名是不是和上面的方法名字一样

 

愿我们终有重逢之时,

而你还记得我们曾经讨论的话题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李飞刀李寻欢

您的欣赏将是我奋斗路上的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值