将csv转换为本机hadoop格式

时间:2015-11-24 14:30:34

标签: r csv hadoop hdfs hue

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

这个问题与我的另一篇文章有​​关:

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

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

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"

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

“启发你”的代码永远不会使用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中的标头,这意味着如果存在,则必须将其删除。

答案 1 :(得分:0)

出于某种原因我真的不明白我找到了一种方法将csv转换为&#34; native&#34;格式。因此,使用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格式似乎就会转换为本机格式。知道为什么吗?