写点什么

java 读取 movielens 数据 txt

作者:Java-fenn
  • 2022 年 9 月 13 日
    湖南
  • 本文字数:1871 字

    阅读完需:约 6 分钟

java 读取 movielens 数据 txt


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


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


//相加及打印字符 charString 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);结果如下:列名是不是和上面的方法名字一样


愿我们终有重逢之时,而你还记得我们曾经讨论的话题。

用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
java读取movielens数据txt_Java_Java-fenn_InfoQ写作社区