我必须将数据从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万条记录的表上多次尝试了这个方法,我能够正确地导入数据,最大值、不同值和源和目标之间的计数匹配。但我只是想确认我在试验中并不幸运。
暂无答案!
目前还没有任何答案,快来回答吧!