在spark中使用伪数字键并行导入使用jdbc连接的rdbms数据可以吗?

f0brbegy  于 2021-05-27  发布在  Spark
关注(0)|答案(0)|浏览(349)

我必须将数据从oracle表导入spark dataframe,并且可以使用下面使用jdbc连接和并行查询的模板成功地完成。

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:oracle:thin:@//host:port/SID") \
    .option("dbtable", "(a select query) (OR) a table name") \
    .option("user", "username") \
    .option("password", "password") \
    .option("driver", "oracle.jdbc.driver.OracleDriver") \
    .option("partitionColumn", "numeric PK") \
    .option("lowerBound", "1") \
    .option("upperBound", "max(partitionCol)") \
    .option("numPartitions", "10") \
    .load()

我知道这里的边界条件并没有过滤掉记录,而只是用来决定步距。
对于一些进口产品,我不得不利用 ROW_NUMBER() OVER (ORDER BY PK/Index Col) RNUM 并在源数据中没有可用的数字键时将其用作分区列。但是,最终我无法引用row\ u number()函数中的任何列,并考虑使用一个伪数字列,如 ROWNUM 对于oracle或 ROW_NUMER() OVER (ORDER BY (SELECT NULL)) 对于sqlserver表。
但这会导致这样一个问题:在导入过程中的哪个时间点,是执行这个row\u number()还是rownum查询?它的值是每次在每个分区的查询中新计算的吗?或者这个列的完整select查询在开始时只运行一次,然后将其结果用于将数据拆分为多个分区?
如果没有order by的rownum或row\ U number()有可能在多次运行时不会以相同的顺序生成结果,那么spark dataframe中导入的数据是否会有重复或重叠的数据块?
我在一个有大约20万条记录的表上多次尝试了这个方法,我能够正确地导入数据,最大值、不同值和源和目标之间的计数匹配。但我只是想确认我在试验中并不幸运。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题