用于大型数据集的sparklyr中copy_to的替代方法

时间:2017-06-06 23:24:56

标签: r hive apache-spark-sql sparklyr

我有下面的代码,它使数据集使用一个使用Sparklyr调用spark SQL API的包装函数对其进行SQL转换。然后我使用“invoke(”createOrReplaceTempView“,”name“)”将Spark环境中的表保存为spark数据帧,以便我可以调用将来的函数调用。然后我使用dplyr代码“mutate”调用hive函数“regexp_replace”将字母转换为数字(0)。我需要再次调用SQL函数。

然而,为了这样做,我似乎必须使用来自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")

1 个答案:

答案 0 :(得分:3)

如果您有一个代表,它会有所帮助,但请尝试

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