基于java的sparkSQL从mysql中读取数据

发现网上基于java的写法很少,这里就做个记录,两种从mysql中读取数据的方法。
第一种:
        String sql = " (select u.user_name_zh, r.organ_name from user_group_organ r, user as u "
                + "where r.user_id=u.user_id limit 1,5) as user_organ";
        SQLContext sqlContext = SQLContext.getOrCreate(JavaSparkContext.toSparkContext(sc)); 
        DataFrameReader reader = sqlContext.read().format("jdbc");
        reader.option("url","jdbc:mysql://192.168.7.66:3306/mydb");//数据库路径
        reader.option("dbtable",sql);//数据表名
        reader.option("driver","com.mysql.jdbc.Driver");
        reader.option("user","root");
        reader.option("password","123321");

        Dataset projectDataSourceDFFromMySQL = reader.load();
        projectDataSourceDFFromMySQL.show();

很多人reader.option(“dbtable”,sql)这句sql写的是表名,然后load后再写SQL语句进行过滤,这种方式会把mysql中表中的数据都加载到内存里,然后用sparkSQL转化成的spark算子进行计算,这样相当于完全抛弃关系型数据的特点,比如有的时候使用索引速度比spark本身要快,而且完全load的方式涉及大量的I/O操作,也会影响速度。因此,我们要灵活运用,把所有技术的特点结合起来。
第二种:

        String sql = "select project_code from gb_t_project where project_code in "
                + " (select m.project_code from (select project_code from gb_t_project "
                + " group by project_code having count(project_code) > 1 limit ?,?) as m)";
        JavaRDD jdbcRDD = JdbcRDD.create(sc, new MyConnectionFactory(), sql, 1, 10000, 2, new Function() {
            private static final long serialVersionUID = -3862012009705676636L;

            public String call(ResultSet v1) throws Exception {
                return v1.getString(1 );
            }

        });

上边的limit必须要写两个占位符,然后JdbcRDD.create的第三、四、五个参数分别表示查询的开始开始标志,结束标志,分几部分。开始标志和结束标志可以是任何一个表查询的条件,比如ID或者是排名列等等,我这里直接用了limit关键字。分几部分表示开始标志和结束标志这个范围的数据分几次加载(估计是防止撑爆内存),这三个参数我解释的不是很到位,大家可以查相关资料。
这种方式和上头的方式类似,只不过表现方式不同。没有啥技术含量,写下来供给大家参考吧。

你可能感兴趣的:(spark)