[英]Loading more than one Spark parquet file into a Spark table using R sparklyr?
[英]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.