2015-11-24 3 views
0

Как преобразовать файл csv в собственный формат hadoop, чтобы я мог использовать его с пакетом plyrmr?конвертировать csv в родной формат hadoop

Этот вопрос связан с другим одним из моих постов:

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

У меня есть mtcars в формате CSV, но когда я прочитал его с помощью следующего кода он не работает:

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 

Это уже странно, учитывая то, что plyrmr учебник на GitHub шоу.

Так что я был вдохновлен следующий код, который записывает 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" 

Любые идеи?

ответ

0

По какой-то причине я действительно не понимаю, что нашел способ преобразования 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 

Похоже, что формат csv преобразуется в native, когда применяется функция plyrmr, отличная от ввода и вывода. Любая идея почему?

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-файл не поддерживается, что означает, что вы должны удалить их, если присутствует.

+0

Я знаю, и я сожалею, но это не главное.Мне было интересно, есть ли способ преобразовать csv в собственный формат, чтобы я мог хранить имена столбцов и не должен сильно менять свой код только для управления именами столбцов. Я до сих пор не знаю, почему я не могу получить тот же результат, что и учебник plyrmr. Вы? – Sam

+0

Это мой лучший ответ извините. Избегайте csv для сохранения метаданных. – piccolbo

Смежные вопросы