sparklyr:跳过第一行文本文件

时间:2016-10-21 21:41:26

标签: r csv apache-spark sparklyr

我想跳过(删除)文本文件的前两行: 据我所知,闪光方法spark_read_csv无法实现这一点。有一些解决方法可以解决这个简单的问题吗?

我知道sparklyr extension的存在,但我正在寻找一个"更多"实现目标的标准方法。

1 个答案:

答案 0 :(得分:1)

您可以使用带有 spark_reader 版本中引入的函数 1.3.0 的自定义阅读器。 API reference

让我们看一个例子。假设您有 2 个文件:

sample1.csv 包含:

# file 1 skip line 1
# file 1 skip line 2
header1,header2,header3
row1col1,row1col2,1
row2col1,row2col2,1
row3col1,row3col2,1

sample2.csv 包含:

# file 2 skip line 1
# file 2 skip line 2
header1,header2,header3
row1col1,row1col2,2
row2col1,row2col2,2
row3col1,row3col2,2

以下代码从本地文件系统读取文件,但同样可以应用于 HDFS 源。

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local")

paths <- paste("file:///", 
               list.files(getwd(), pattern = "sample\\d", full.names = TRUE), 
               sep = "")
paths

路径必须是绝对路径,在我的示例中:"file:///C:/Users/erodriguez/Documents/sample1.csv" ...。然后使用数据类型定义模式。 custom_csv_reader 是读取器函数,它获取 URI 并返回数据帧。读取器任务将分布在 Spark 工作节点之间。请注意,read.csv 调用具有参数 skip = 2 以删除前两行。

schema <- list(name1 = "character", name2 = "character", file = "integer")

custom_csv_reader <- function(path) {
  read.csv(path, skip = 2, header = TRUE, stringsAsFactors = FALSE)
}

data <- spark_read(sc, path = paths, reader = custom_csv_reader, columns = schema)

data 

结果:

# Source: spark<?> [?? x 3]
  name1    name2     file
  <chr>    <chr>    <int>
1 row1col1 row1col2     1
2 row2col1 row2col2     1
3 row3col1 row3col2     1
4 row1col1 row1col2     2
5 row2col1 row2col2     2
6 row3col1 row3col2     2