在sparklyr中导入多个文件

时间:2018-03-31 10:23:49

标签: r apache-spark 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 filelist中的 k :th .txt文件。所以我的问题是:闪闪发光器是否有相同的方法来做到这一点?

我尝试了什么

我试图使用lapply()spark_read_csv,就像我在上面做的那样闪闪发光。刚刚将read.table更改为spark_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将它们放在一起。

编辑:

找到了办法。问题在于论证" name"每次读取新文件时都需要更新spark_read_csv,否则会覆盖。所以我在for循环中而不是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)
}

1 个答案:

答案 0 :(得分:3)

既然你(强调我的)

  

有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)

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

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

但是从0.7.0-9014开始,它未在中正确实现(current implementation of spark_normalize_path不支持大于1的向量)。