2017-06-06 176 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