2017-12-03 225 views
2

我使用的查询,如下所示,以从MySQL获取数据:虚列火花JDBC

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)与option其中I指定partitionColumn

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

回答

1

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

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

参考:http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases

+0

@clear sky,请标记答案为已接受,如果它解决您的查询。 –

+0

请更具体一点 - 它可以是伪列吗?例如,像Oracle ROWNUM? –

+0

你有没有尝试在你的代码中使用ROWNUM而不是order_id? –

2

我可以使用(在Oracle或RRN(为employeeno)在DB2像ROWNUM)是伪列

TL; DR大概没有。

虽然星火不考虑像PRIMARY KEYUNIQUE约束有非常重要要求为partitionColumn,这是不明确的文件中指出 - 它必须是确定性

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

由于ROWNUM的实现通常是不稳定的(取决于非稳定排序,并且可能受索引等功能的影响),因此partitionColumn没有安全的选择。出于同样的原因,你不能使用随机数字。

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

是的,只要它满足上述条件。