2017-04-09 105 views
1

我正在使用sparklyr庫。在Spark中做計算(R)

我有一個變量,wtd我複製到火花:

copy_to(sc,wtd) 
colnames(wtd) <- c("a","b","c","d","e","f","g") 

然後,我想做一個計算和存儲的火花,而不是在我的R.

當我試圖環境:

sdf_register(wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d), "wtd2") 

錯誤UseMethod( 「sdf_register」): 沒有適用的方法對於「sdf_register」適用於類的對象「C(‘tbl_df’,‘TBL’,‘data.frame’)」

命令wtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d)工作正常,但將其保存在我的環境中,不在火花中。

回答

3

您的操作順序中的第一個參數應該是「tbl_spark」,而不是常規data.frame。你的命令,

wtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d) 

工作原理是因爲你根本沒有使用Spark,只是普通的R data.frames。

如果你想與火花使用它,首先,存儲返回的spark_tbl變量時您複製data.frame

colnames(wtd) <- c("a","b","c","d","e","f","g") 
wtd_tbl <- copy_to(sc, wtd) 

然後,您可以使用sdf_register(wtd_tbl %>% ..., "wtd2")執行你的數據管道。

如果執行所定義的管道,你會得到一個異常的說法:

Error: org.apache.spark.sql.AnalysisException: Window function rownumber() requires window to be ordered 

這是因爲爲了在星火使用row_number(),首先你需要提供一個「高階函數」。你可以用arrange()。我假設你希望你的行被列「c」和「b」的排序,所以你最終的管道將是這樣的:

sdf_register(wtd_tbl %>% 
       dplyr::group_by(c, b) %>% 
       arrange(c, b) %>% 
       dplyr::filter(row_number() == 1) %>% 
       dplyr::count(d), 
      "wtd2") 

我希望這有助於。

+1

謝謝!這有幫助! –

+0

@JaimeCaffarel這很有趣,你的回答在這一刻幫助我很多! :)我沒有得到什麼是運行'copy_to'和'sdf_register'之間的區別。 Arent我們在兩種情況下都創建了火花datafranes? –

+1

@Noobie謝謝:-)區別在於'copy_to'只是將數據框複製到Spark中,而'sdf_register'爲數據框創建Hive元數據,因此您可以使用Hive檢查數據(從表「wtd2」在這種情況下)。 –