基于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<Row> 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<String> jdbcRDD = JdbcRDD.create(sc, new MyConnectionFactory(), sql, 1, 10000, 2, new Function<ResultSet, String>() {
            private static final long serialVersionUID = -3862012009705676636L;

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

        });

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值