2017-06-06 181 views
1

我有下面的代碼需要一個數據集使用包裝函數對它進行SQL轉換,該函數使用Sparklyr調用spark API。然後,我使用「invoke(」createOrReplaceTempView「,」name「)」將表格作爲Spark數據框保存在Spark環境中,以便我可以調用該函數以進行未來的函數調用。然後我使用dplyr代碼「mutate」來調用配置單元函數「regexp_replace」將字母轉換爲數字(0)。我需要再次調用SQL函數。替代copy_to在sparklyr中處理大型數據集

不過要做到這一點,我似乎必須使用sparklyr的「copy_to」功能。在大型數據集的「copy_to」功能導致以下錯誤:

Error: org.apache.spark.SparkException: Job aborted due to stage 
failure: Total size of serialized results of 6 tasks (1024.6 MB) is 
bigger than spark.driver.maxResultSize (1024.0 MB) 

是否有替代「copy_to」,讓我得到一個火花數據幀,我可以再與SQL API調用?

這裏是我的CODEL

sqlfunction <- function(sc, block) { 
    spark_session(sc) %>% invoke("sql", block) 
} 

sqlfunction(sc, "SELECT * FROM 
test")%>%invoke("createOrReplaceTempView", 
"name4") 

names<-tbl(sc, "name4")%>% 
    mutate(col3 = regexp_replace(col2, "^[A-Z]", "0")) 

copy_to(sc, names, overwrite = TRUE) 

sqlfunction(sc, "SELECT * FROM 
test")%>%invoke("createOrReplaceTempView", 
"name5") 

final<-tbl(sc, "name5") 

回答

2

它會幫助,如果你有一個reprex,但嘗試

final <- names %>% 
    spark_dataframe() %>% 
    sqlfunction(sc, "SELECT * FROM test") %>% 
    sdf_register("name5") 
+0

這正是我終於實現了,這是很好。 –

+1

不會sdf_register基本上創建一個視圖,並不會將數據保存到磁盤或內存?我問,因爲我正在做一個大連接,並且注意到sdf_register沒有保留結果中的數據,我不得不等待連接重新運行。只是想學習。 – ansek