sparklyr:从列表中填充“spark_read_parquet 路径”参数

sparklyr: fill `spark_read_parquet path` argument from list

我想以相同的方式处理同一个 s3 存储桶中的多个文件。所以,我创建了一个文件名列表:

dt <- seq(as.Date("1991/12/23"), by = "day", length.out = 5)
dt_ls <- paste0('s3://donuts/date=',dt)

然后我 运行 对该列表进行 for 循环:

for (i in 1:length(dt)){
  df <- spark_read_parquet(sc, "df", path = dt_ls[i]) #readin
  df_tbl <- tbl(sc, "df")                             #convert to tbl
  #perform w/e operations you like
  rm(df)
}

但是,我在尝试分配 path = dt_ls[i] 时立即遇到两个错误之一。

Error in UseMethod("invoke"): no applicable method for 'invoke' applied to an object of class "character"

或:

Error in as.vector(x, "character"): cannot coerce type 'environment' to vector of type 'character'

我在 运行 隔离单行时看到相同的错误,例如:

tmp <- spark_read_parquet(sc, "tmp", path = dt_ls[1])

我读到的这些错误是我无法将保存为对象的 s3 文件路径传递给 spark_read_parquet,因为由于命令的后端正在调用 invoke,它不会直接到我传递给它的列表索引的内容。因此,我必须将路径直接写入 path 参数。

这样的解释正确吗?是否有变通办法让我可以自动打开所有这些文件?

解决方案:

出现在列表中 chr 对象周围的引号似乎是问题所在。在将列表索引传递给 spark_read_parquet 中的 path 参数时删除这些引号允许函数正常 运行。

所以简单的解决方案:

tmp <- spark_read_parquet(sc, "tmp", path = noquotes(dt_ls[1]))

以及导致问题的输入示例:

   [1] “s3://donuts/date=2021-12-23”
   [2] “s3://donuts/date=2021-12-24”
   [3] “s3://donuts/date=2021-12-25”

因此传递的文件路径必须类似于:

[1] s3://donuts/date=2021-12-23