首先数据源是sql server
考虑使用JDBC进行读取
Spark内置了DataFrameReader进行数据表或者子查询映射成DataFrame对象
的方法,现在假设这个表很大,如果一次性完成读取及转化内存会挂掉
有没有很好的方法进行数据读取及后续分析。
这里希望回答能够使用Scala API给出,或者实在没有Java也行个人之前完成这种数据库读取的任务是使用python pandas read_sql
由于其支持返回进行读取的迭代器,可以之后对迭代器进行遍历得到相应
的文件并进行本地化。
这里采用分割的方法也是为了后续的处理可以并行,之后再"reduce"成一个
结果
相应示例代码见
http://blog.csdn.net/sinat_30665603/article/details/72794256不知道相同的实现在Spark中如何实现。个人倾向于将数据从数据库调出本地化(serialize)为对象后进行统一
地操作的方法。(最好不用SQL)
其中不妥的地方往指正。能否给出类似的用Scala Spark的逻辑进行操作的方式,希望能较大程度
地利用多核并行的优势,至少要比上面链接中设计的python脚本要快。有没有相关的数据处理的好书能够推荐一下吗?最好是英文的。
谢谢

解决方案 »

  1.   

    更新一下 导出可以使用jdbc 自己的结果集(resultSet)
    来完成,其基本上就是一个迭代器。
    但是还是请教一下 推荐的书目及处理方法。
      

  2.   

    虽然自己弄出来了
    http://blog.csdn.net/sinat_30665603/article/details/74161591但是 分回不来了有没有推荐书目的
    有好书给分偶
      

  3.   

    https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#microsoft-sqlserver-example
    请参考
    如果内存溢出,请加大并行,把读入的数据分摊到多个机器上,溢出的几率就会下降.
    关注一下文章中 下推优化 那部分,其实读入数据时是可以提前过滤一部分数据的,这也许对你有帮助
      

  4.   

    把数据库中的数据转到hive中可以吗
      

  5.   

    不是你是存在mysql还是存在mysql的集群,如果你只有一个mysql,那么就谈不上数据的本地性了,你可以使用rdd,创建多个partition。partition是分布式的,那么你可以在逻辑控制去从不同node读取mysql的,然后再转成df,至于你是根据什么条件进行split,就看你的业务了。如果是集群,那尽量遵循数据本地性原则。