3

我正在使用查询从 MYSQL 中获取数据,如下所示:

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() 

问题是,我可以在我指定的位置使用伪列(如ROWNUM在 Oracle 或RRN(employeeno)DB2 中)吗?optionpartitionColumn

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

4

2 回答 2

6

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

TL; DR 可能没有。

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

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

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

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

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

可能会静默失败,导致结果不正确。

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

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

于 2017-12-03T14:38:49.847 回答
-1

根据Spark 的官方文档partitionColumn可以是任何数字列(不一定是主键列)。

partitionColumn 必须是相关表中的数字列。

参考:https ://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

于 2017-12-03T10:21:35.170 回答