使用spark复制大型关系表的内容,然后以parquet格式(没有sqoop)写入分区的hive表,内存效率最高的方法是什么。我有一个基本的spark应用程序,我用spark的jdbc做了一些其他的调整,但是关系表中的数据仍然是0.5tb和20亿条记录,所以尽管我可以懒洋洋地加载整个表,但我正在尝试找出如何有效地按日期分区并保存到hdfs,而不会遇到内存问题。从jdbc开始 load()
从spark将所有内容加载到内存中我曾想过在数据库查询中遍历日期,但仍然不确定如何确保内存不会耗尽。
使用spark复制大型关系表的内容,然后以parquet格式(没有sqoop)写入分区的hive表,内存效率最高的方法是什么。我有一个基本的spark应用程序,我用spark的jdbc做了一些其他的调整,但是关系表中的数据仍然是0.5tb和20亿条记录,所以尽管我可以懒洋洋地加载整个表,但我正在尝试找出如何有效地按日期分区并保存到hdfs,而不会遇到内存问题。从jdbc开始 load()
从spark将所有内容加载到内存中我曾想过在数据库查询中遍历日期,但仍然不确定如何确保内存不会耗尽。
1条答案
按热度按时间0g0grzrc1#
如果需要使用spark,可以添加到应用程序中
date
参数用于按日期筛选表,并为每个日期在循环中运行spark应用程序。对于这个循环,可以使用bash或其他脚本语言。这看起来像:
日期中的每个日期
spark-submit
您的应用程序date
参数读取数据库表
spark.read.jdbc
筛选依据date
使用filter
方法将结果写入hdfs
df.write.parquet("hdfs://path")
另一种选择是使用不同的技术,例如使用jdbc和db cursor实现scala应用程序,以迭代行并将结果保存到hdfs。这更复杂,因为您需要解决与使用scala写入parquet格式和保存到hdfs相关的问题。如果你想我可以提供scala代码负责写Parquet格式。