我对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.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,而不是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)
}
自从你(强调我的)
在同一个文件夹中有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起,它尚未在sparklyr中正确实现(当前的实现spark_normalize_path
不支持大小大于1的向量)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句