Apache spark 使用JDBC从Spark中的RDBMS读取增量和并行性
我正在从事一个项目,该项目涉及使用JDBC从RDBMS读取数据,我成功地读取了数据。这是我每周都会经常做的事情。因此,我一直试图找到一种方法来确保在初始读取之后,后续的读取应该只提取更新的记录,而不是从表中提取整个数据。 通过指定三个参数Apache spark 使用JDBC从Spark中的RDBMS读取增量和并行性,apache-spark,apache-spark-sql,sqoop,Apache Spark,Apache Spark Sql,Sqoop,我正在从事一个项目,该项目涉及使用JDBC从RDBMS读取数据,我成功地读取了数据。这是我每周都会经常做的事情。因此,我一直试图找到一种方法来确保在初始读取之后,后续的读取应该只提取更新的记录,而不是从表中提取整个数据。 通过指定三个参数(-check列,--incremental last modified/append和--last value),我可以使用sqoop incremental import实现这一点。但是,我不想为此使用sqoop。有没有办法用Scala在Spark中复制相同
(-check列,--incremental last modified/append
和--last value),我可以使用sqoop incremental import实现这一点。但是,我不想为此使用sqoop。有没有办法用Scala在Spark中复制相同的功能
其次,有些表没有可以用作partitionColumn
的唯一列,因此我考虑使用行号函数向这些表中添加一个唯一列,然后分别将唯一列的MIN
和MAX
作为lowerBound
和upperBound
。我现在面临的挑战是如何将这些值动态解析到read语句中,如下所示:
val queryNum = "select a1.*, row_number() over (order by sales) as row_nums from (select * from schema.table) a1"
val df = spark.read.format("jdbc").
option("driver", driver).
option("url",url ).
option("partitionColumn",row_nums).
option("lowerBound", min(row_nums)).
option("upperBound", max(row_nums)).
option("numPartitions", some value).
option("fetchsize",some value).
option("dbtable", queryNum).
option("user", user).
option("password",password).
load()
我知道上面的代码不正确,可能遗漏了很多过程,但我想它将概述我在这里要实现的目标。在Spark中处理增量JDBC读取非常复杂。恕我直言,它严重限制了构建许多应用程序的易用性,如果Sqoop正在做这项工作,可能不值得您费心
然而,这是可行的。有关使用dbtable选项的示例,请参见此线程:
要保持此作业幂等,您需要直接从加载所有数据文件或通过每次写入的日志文件读取先前输出的max行。如果数据文件很大,可能需要使用日志文件,如果较小,则可能需要加载日志文件