Spark和JDBC:遍历大表并写入hdfs

时间:2017-06-22 11:07:57

标签: apache-spark hive hdfs apache-spark-sql spark-dataframe

使用spark复制大型关系表的内容然后以镶木地板格式(没有sqoop)写入分区的Hive表,最有效的内存方式是什么?我有一个基本的火花应用程序,我已经用spark的jdbc进行了一些其他的调整,但是关系表中的数据仍然是0.5 TB和20亿条记录所以我虽然我可以懒得加载整个表,但我试过找出如何有效地按日期分区并保存到hdfs而不会遇到内存问题。因为来自spark的jdbc load()会将所有内容加载到内存中,我想在数据库查询中循环查看日期,但仍然不确定如何确保我不会耗尽内存。

1 个答案:

答案 0 :(得分:0)

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

这看起来像:

  • 日期中的约会日期
      使用spark-submit参数
    • date您的申请
    • 使用spark.read.jdbc
    • 读取数据库表
    • 使用date方法
    • filter过滤
    • 使用df.write.parquet("hdfs://path")
    • 将结果写入HDFS

另一个选择是使用不同的技术,例如使用JDBC和DB游标实现Scala应用程序来遍历行并将结果保存到HDFS。这更复杂,因为您需要解决与写入Parquet格式相关的问题并使用Scala保存到HDFS。如果您愿意,我可以提供负责写入Parquet格式的Scala代码。