大数据集中Sparklyr的copy_to替代方案

4
我有以下代码,它将数据集输入一个包装函数进行SQL转换,使用Sparklyr调用Spark SQL API。然后我使用“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”的方式让我得到一个Spark数据框,然后可以使用SQL API进行调用?
以下是我的代码:
 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个回答

8

如果您有一个reprex将会很有帮助,但是您可以尝试:

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

这正是我最终所做的,而且效果很好。 - Levi Brackman
1
sdf_register 基本上只是创建一个视图,不会将数据保存到磁盘或内存中吗?我问这个问题是因为我在做一个大连接时注意到 sdf_register 没有保留结果的数据,我必须等待连接重新运行。只是想学习一下。 - ansek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接