【问题标题】:sparklyr: skip first lines of text filessparklyr:跳过文本文件的第一行
【发布时间】:2017-03-04 07:21:50
【问题描述】:

我想跳过(删除)文本文件的前两行: 据我所知,使用 sparklyr 方法 spark_read_csv 是不可能的。有一些解决方法可以解决这个简单的问题吗?

我知道sparklyr extension 的存在,但我正在寻找一种“更”标准的方式来实现我的目标。

【问题讨论】:

    标签: r csv apache-spark sparklyr


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多