2017-06-22 90 views
0

什么是最有效的内存复制方式,使用spark复制大型关系表的内容,然后以实木复合格式(不带sqoop)写入分区Hive表。我有一个基本的火花应用程序,我已经做了一些与火花的jdbc其他调整,但关系表中的数据仍然是0.5 TB和2十亿记录,所以我虽然我可以懒加载全表,我想弄清楚如何有效按日期分区并保存到hdfs,而不会遇到内存问题。因为来自spark的jdbc load()会将所有内容加载到内存中我正在考虑循环访问数据库查询中的日期,但仍不确定如何确保不会耗尽内存。Spark和JDBC:遍历大表并写入hdfs

回答

0

如果您需要使用Spark,您可以添加到应用程序date参数中,以按日期过滤表并在每个日期的循环中运行Spark应用程序。您可以在此循环中使用bash或其他脚本语言。

这可以是这样的:在日期

  • 的foreach日期
    • ​​与date参数应用程序
    • 读取数据库表spark.read.jdbc
    • 过滤器通过date使用filter方法
    • 使用0将结果写入HDFS

另一种选择是使用例如不同技术使用JDBC和DB光标通过行迭代和将结果放入HDFS实现Scala的应用。这更复杂,因为您需要解决与使用Scala写入Parquet格式和保存到HDFS相关的问题。如果你想我可以提供负责写入Parquet格式的Scala代码。

+0

但是,如果我循环遍历一个日期数组,并通过这些日期循环'jdbc.read',那么我是否仍然继续用每个连续的'load()'语句继续填充内存,或者你的意思是别的东西? – horatio1701d

+0

我的意思是在某些脚本语言中运行这个循环,例如bash和sumbitting你的Spark应用程序,所以我不是说在Scala中实现这个循环,因为你确实仍然会遇到内存问题。 –

+0

这是有道理的。谢谢。 – horatio1701d