在Sparklyr中导入多个文件

shitoushan

我对Sparklyr和Spark非常陌生,所以请告诉我这是否不是“火花”方式。

我的问题

我有50多个.txt文件,每个文件的大小约为300 mb,所有文件都在同一个文件夹中,称为x,我需要将其导入到sparklyr中,最好是一张表。

我可以像这样单独阅读

spark_read_csv(path=x, sc=sc, name="mydata", delimiter = "|", header=FALSE)

如果要将它们全部导入sparklyr之外,则可能会创建一个包含文件名的列表,调用它filelist,然后将它们全部导入到带有lapply的列表中

filelist = list.files(pattern = ".txt")
datalist = lapply(filelist, function(x)read.table(file = x, sep="|", header=FALSE)) 

这给了我一个列表,其中元素k是中的k:th .txt文件filelist所以我的问题是:sparklyr是否有等​​效的方法可以做到这一点?

我尝试过的

我尝试使用lapply()spark_read_csv,就像我在外部sparklyr中所做的一样。刚更改read.tablespark_read_csv和参数

datalist = lapply(filelist, function(x)spark_read_csv(path = x, sc = sc, name = "name", delimiter="|", header=FALSE))

这给了我一个与.txt文件具有相同数量元素的列表,但是每个元素(.txt文件)都与文件列表中的最后一个.txt文件相同。

> identical(datalist[[1]],datalist[[2]])
[1] TRUE

我显然希望每个元素都是数据集之一。我的想法是,在此之后,我可以将rbind它们放在一起。

编辑:

找到了办法。问题在于spark_read_csv,每次读取新文件时,都需要更新参数“ name” ,否则它将被覆盖。因此,我在for循环中执行了lapply,而不是lapply,并且在每次迭代中都更改了名称。有更好的方法吗?

datalist <- list()
for(i in 1:length(filelist)){
  name <- paste("dataset",i,sep = "_")
  datalist[[i]] <- spark_read_csv(path = filelist[i], sc = sc,
  name = name, delimiter="|", header=FALSE)
}
零323

自从你(强调我的)

在同一个文件夹中有50个以上的.txt文件,每个文件约300 mb

您可以在路径中使用通配符:

spark_read_csv(
  path = "/path/to/folder/*.txt",
  sc = sc, name = "mydata", delimiter = "|", header=FALSE) 

如果目录仅包含数据,则可以进一步简化此操作:

spark_read_csv(
  path = "/path/to/folder/",
  sc = sc, name = "mydata", delimiter = "|", header = FALSE)

本机Spark读取器还支持一次读取多个路径(Scala代码):

spark.read.csv("/some/path", "/other/path")

但自0.7.0-9014起,它尚未在正确实现当前的实现spark_normalize_path不支持大小大于1的向量)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章