【问题标题】:convert csv in to native hadoop format将 csv 转换为原生 hadoop 格式
【发布时间】:2015-11-24 14:30:34
【问题描述】:

如何将 csv 文件转换为本机 hadoop 格式,以便可以将其与 plyrmr 包一起使用?

这个问题与我的另一个帖子有关:

How to read files in HDFS in R without loosing column and row names

我有 csv 格式的 mtcar,但是当我使用以下代码阅读它时它不起作用:

filename3 <- "/user/sgerony/mtcars.csv" #file uploaded manually on to the HDFS
input(filename3) ## DOES NOT WORK

当我使用以下代码阅读它时,它可以工作,但我丢失了列名:

input(filename3,format=make.input.format(format = "csv", sep=",")) ## works

结果:

                    V1   V2  V3    V4  V5   V6    V7    V8 V9 V10  V11  V12
1    Chrysler Imperial 14.7   8   440 230 3.23 5.345 17.42  0   0    3    4
2             Fiat 128 32.4   4  78.7  66 4.08   2.2 19.47  1   1    4    1
3          Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1   1    4    2
4       Toyota Corolla 33.9   4  71.1  65 4.22 1.835  19.9  1   1    4    1

考虑到 github 上的 plyrmr 教程显示的内容,这已经很奇怪了。

所以我受到以下代码的启发,该代码将 mtcars 写入 HDFS 并读回以查看列名是否保留:

output(
      bind.cols(
        input(mtcars),
        carb.per.cyl = carb/cyl),
      path="/user/sgerony/mtcars0.out") 

结果:

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb carb.per.cyl
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    0.6666667
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    0.6666667
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    0.2500000
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    0.1666667

然后:

x=output(
      bind.cols(
        input(mtcars),
        carb.per.cyl = carb/cyl),
      path="/user/sgerony/mtcars0.out")
    get.format(x)

结果:

"native"

有什么想法吗?

【问题讨论】:

    标签: r csv hadoop hdfs hue


    【解决方案1】:

    “启发你”的代码从不使用 csv。

    hexdump /tmp/mtcars0.out | head
    0000000 94 00 00 00 00 93 00 00 01 6c 08 00 00 00 02 94
    0000010 00 00 00 00 93 00 00 01 11 08 00 00 00 0c 91 00
    0000020 00 00 01 06 91 00 00 00 01 06 91 00 00 00 01 06
    0000030 91 00 00 00 01 06 91 00 00 00 01 06 91 00 00 00
    0000040 01 06 91 00 00 00 01 06 91 00 00 00 01 06 91 00
    0000050 00 00 01 06 91 00 00 00 01 06 91 00 00 00 01 06
    0000060 91 00 00 00 01 06 92 00 00 00 26 00 00 00 03 07
    0000070 00 00 00 05 6e 61 6d 65 73 07 00 00 00 09 72 6f
    0000080 77 2e 6e 61 6d 65 73 07 00 00 00 05 63 6c 61 73
    0000090 73 08 00 00 00 03 92 00 00 00 6e 00 00 00 0c 07
    

    试试make.input.format(format = "csv", sep = ",", col.names = names(mtcars)) 由于读取分区文件的方式,不支持 csv 中的标头,这意味着您必须删除它们(如果存在)。

    【讨论】:

    • 我知道,很抱歉,但这不是重点。我想知道是否有办法将 csv 转换为本机格式,这样我就可以保留列名,而不必仅仅为了列名管理而更改我的代码。我仍然不知道为什么我不能得到与 plyrmr 教程相同的输出。你呢?
    • 抱歉,这是我最好的答案。避免使用 csv 来保存元数据。
    【解决方案2】:

    出于某种我真的不明白的原因,我找到了一种将 csv 转换为“本机”格式的方法。因此,使用 mtcars 数据集并将其分成两个 csv 文件,一个用于名称 (mtcars_names.csv),另一个用于数据 (mtcars_no_names.csv):

    filename <- "/user/sgerony/mtcars_no_names.csv"
    filename.names <- "/user/sgerony/mtcars_names.csv"
    filename.names <- as.data.frame(input(filename.names,
    format=make.input.format(format = "csv", sep=",")))
    
    for(i in 1:dim(filename.names)[2]){
      filename.names[,i] <- as.character(filename.names[,i])
    }
    
    output(input(filename,format=make.input.format(format = "csv",
      sep=",", col.names = filename.names[1,])),
      path="/user/sgerony/mtcars_output_csv")
    
    #test the output
    input("/user/sgerony/mtcars_output_csv",
      format=make.input.format(format = "csv", sep=","))
    

    结果:

                 V1 V2 V3  V4  V5   V6    V7    V8 V9 V10 V11 V12
    1    Datsun 710 22  4 108  93 3.85 2.320 18.61  1   1   4   1
    2     Mazda RX4 21  6 160 110 3.90 2.620 16.46  0   1   4   4
    3 Mazda RX4 Wag 21  6 160 110 3.90 2.875 17.02  0   1   4   4
    

    如前所述,列名消失,但现在如果我应用 bind.cols 函数,我不明白输出是本机格式:

    output(
      bind.cols(
        input("/user/sgerony/mtcars_no_names.csv",
    format=make.input.format(format = "csv", sep=",", col.names = filename.names[1,])),
        carb.per.cyl = carb/cyl), 
      "/user/sgerony/mtcars1.out")
    input("/user/sgerony/mtcars1.out")
    

    结果:

              model mpg cyl disp  hp drat    wt  qsec vs am gear carb carb.per.cyl
    1    Datsun 710  22   4  108  93 3.85 2.320 18.61  1  1    4    1    0.2500000
    2     Mazda RX4  21   6  160 110 3.90 2.620 16.46  0  1    4    4    0.6666667
    3 Mazda RX4 Wag  21   6  160 110 3.90 2.875 17.02  0  1    4    4    0.6666667
    

    因此,每当应用除输入和输出之外的 plyrmr 函数时,似乎 csv 格式都会转换为本机格式。知道为什么吗?

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2018-01-31
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多