java 读取 movielens 数据 txt
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;}
使用记录:
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;}
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);结果如下:列名是不是和上面的方法名字一样
愿我们终有重逢之时,而你还记得我们曾经讨论的话题。
评论