2017-12-03 406 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沒有安全的選擇。出於同樣的原因,你不能使用隨機數字。

我們可以指定一個分區列這不是一個主鍵

是的,只要它滿足上述條件。