Pseudocolumn in Spark JDBC

cle*_*sky 3 apache-spark apache-spark-sql spark-jdbc

I am using a query to fetch data from MYSQL as follows:

var df = spark.read.format("jdbc")
         .option("url", "jdbc:mysql://10.0.0.192:3306/retail_db")
         .option("driver" ,"com.mysql.jdbc.Driver")
         .option("user", "retail_dba")
         .option("password", "cloudera")
         .option("dbtable", "orders")
         .option("partitionColumn", "order_id")
         .option("lowerBound", "1")
         .option("upperBound", "68883")
         .option("numPartitions", "4")
         .load() 
Run Code Online (Sandbox Code Playgroud)

Question is, can I use a pseudo column (like ROWNUM in Oracle or RRN(employeeno) in DB2) with option where I specify the partitionColumn ?

If not, can we specify a partition column which is not a primary key ?

hi-*_*zir 6

我可以使用伪列吗(如 Oracle 中的 ROWNUM 或 DB2 中的 RRN(employeeno))

TL; DR 可能没有。

虽然 Spark 不考虑约束,例如PRIMARY KEYUNIQUE非常重要的要求partitionColumn,但文档中没有明确说明 - 它必须是确定性的

每个执行器使用单独的事务获取自己的数据。如果数字列不是确定性的(稳定的,在事务之间保留),Spark 看到的数据状态可能会不一致,并且记录可能会重复或跳过。

因为ROWNUM实现通常是不稳定的(取决于不稳定的排序并且可能会受到索引等功能的影响),所以partitionColumn. 出于同样的原因,您不能使用随机数。

此外,一些供应商可能会进一步限制对伪列的允许操作,使它们不适合用作分区列。例如甲骨文ROWNUM

测试大于正整数的 ROWNUM 值的条件始终为假。

可能会静默失败,导致错误的结果。

我们可以指定一个不是主键的分区列吗

是的,只要它满足上述标准。