在 sparklyr 中导入多个文件
Importing multiple files in sparklyr
我对 sparklyr 和 spark 很陌生,如果这不是 "spark" 的方法,请告诉我。
我的问题
我有 50 多个 .txt 文件,每个大约 300 MB,都在同一个文件夹中,称之为 x
,我需要导入到 sparklyr,最好是一个 table.
我可以像这样单独阅读它们
spark_read_csv(path=x, sc=sc, name="mydata", delimiter = "|", header=FALSE)
如果我要将它们全部导入到 sparklyr 之外,我可能会创建一个包含文件名的列表,将其命名为 filelist
,然后将它们全部导入到带有 lapply[= 的列表中24=]
filelist = list.files(pattern = ".txt")
datalist = lapply(filelist, function(x)read.table(file = x, sep="|", header=FALSE))
这给了我一个列表,其中元素 k 是 filelist
中的第 k:th .txt 文件。所以我的问题是:在 sparklyr 中是否有等效的方法来做到这一点?
我试过的
我试过使用 lapply()
和 spark_read_csv
,就像我在 sparklyr 之外所做的一样。刚刚将 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
他们在一起。
编辑:
找到方法了。问题是每次读取新文件时都需要更新 spark_read_csv
中的参数 "name",否则它会被覆盖。所以我在 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)
}
自从你(强调我的)
have 50+ .txt files at around 300 mb each, all in the same folder
你可以只在路径中使用通配符:
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 开始,它在 sparklyr (current implementation of spark_normalize_path
中未正确实现不支持大小大于一的向量)。
我对 sparklyr 和 spark 很陌生,如果这不是 "spark" 的方法,请告诉我。
我的问题
我有 50 多个 .txt 文件,每个大约 300 MB,都在同一个文件夹中,称之为 x
,我需要导入到 sparklyr,最好是一个 table.
我可以像这样单独阅读它们
spark_read_csv(path=x, sc=sc, name="mydata", delimiter = "|", header=FALSE)
如果我要将它们全部导入到 sparklyr 之外,我可能会创建一个包含文件名的列表,将其命名为 filelist
,然后将它们全部导入到带有 lapply[= 的列表中24=]
filelist = list.files(pattern = ".txt")
datalist = lapply(filelist, function(x)read.table(file = x, sep="|", header=FALSE))
这给了我一个列表,其中元素 k 是 filelist
中的第 k:th .txt 文件。所以我的问题是:在 sparklyr 中是否有等效的方法来做到这一点?
我试过的
我试过使用 lapply()
和 spark_read_csv
,就像我在 sparklyr 之外所做的一样。刚刚将 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
他们在一起。
编辑:
找到方法了。问题是每次读取新文件时都需要更新 spark_read_csv
中的参数 "name",否则它会被覆盖。所以我在 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)
}
自从你(强调我的)
have 50+ .txt files at around 300 mb each, all in the same folder
你可以只在路径中使用通配符:
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 开始,它在 sparklyr (current implementation of spark_normalize_path
中未正确实现不支持大小大于一的向量)。