繁体   English   中英

使用Sparklyr在R中创建懒惰Spark读写木地板作业

[英]Create Lazy Spark Read-Write Parquet Job in R using Sparklyr

我想创建一个火花作业,该作业从sql源读取(使用'spark_read_jdbc'),然后将结果写入拼花地板文件('spark_write_parquet')。

需要多次执行此操作,以便在sql语句中进行较小的增量。 我希望该工作被懒散地创建,以便多个执行者可以接管该工作。 这是一些玩具代码示例:

sql = "SELECT * FROM TBL_%s"
for(i in seq(1,10)){
  sql_to_read = sprintf(sql, i)
  optionSet$dbtable = paste0("(", sql_to_read ,") foo")
  TEMP = spark_read_jdbc(sc, "TEMP", options = optionSet, memory = FALSE)
  TEMP = TEMP %>% mutate(id := i)
  TEMP %>% spark_write_parquet(., path = "/TEMP.parquet", mode = "append", partition_by = id)
}

问题是写操作无法延迟执行串行操作。 有没有办法编写此代码,以便仅为完整操作创建火花作业,然后在我踢出“收集”语句时,多个执行者将执行该操作?

您始终可以使用代码的结构来完全避免问题。 因为所有写入都使用相同的输出表,所以您可以将输入定义为单个联合:

xs <- 1:10
query <- glue::glue("SELECT {xs} AS _id, * FROM TBL_{xs}") %>% 
  glue::collapse(" UNION ALL \n")

接着

optionSet$dbtable <- glue::glue("({query}) tmp")

spark_read_jdbc(sc, "TEMP", options = optionSet, memory = FALSE) %>%
  spark_write_parquet(., path = "/TEMP.parquet", mode = "append", partition_by = id)

您还可以将id用作partitionColumn ,将min(xs) / max(xs)用作lowerBound / upperBound并行化读取

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM