sparklyr:跳过文本文件的第一行
sparklyr: skip first lines of text files
我想跳过(删除)文本文件的前两行:
据我所知,使用 sparklyr 方法 spark_read_csv
是不可能的。有一些解决方法可以解决这个简单的问题吗?
我知道 sparklyr extension 的存在,但我正在寻找一种 "more" 标准方法来实现我的目标。
您可以使用自定义 reader 和版本 1.3.0
中引入的函数 spark_reader
。 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
是 reader 函数,它获取 URI 和 returns 数据帧。 reader 任务将分布在 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
我想跳过(删除)文本文件的前两行:
据我所知,使用 sparklyr 方法 spark_read_csv
是不可能的。有一些解决方法可以解决这个简单的问题吗?
我知道 sparklyr extension 的存在,但我正在寻找一种 "more" 标准方法来实现我的目标。
您可以使用自定义 reader 和版本 1.3.0
中引入的函数 spark_reader
。 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
是 reader 函数,它获取 URI 和 returns 数据帧。 reader 任务将分布在 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