Другим вариантом, если производительность является проблемой, является использование расширения data.table
для расширения reshape2
расплава & amp; dcast functions
( Ссылка: эффективная перестройка с использованием data.tables )
library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
# name 1 2 3 4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
И, как и в data.table v1.9.6, мы можем использовать несколько столбцов
## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
# name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
Итак, в основном вы можете сделать put все, что вы делаете с copyFromLocal , но не наоборот.
Аналогично,
Следовательно , вы можете использовать get вместо copyToLocal , но не наоборот.
Ссылка: Документация Hadoop .
Обновление: для последних, начиная с октября 2015 года, см. этот ответ ниже.
copyFromLocal
ограничено копией из локального, в то время как put
может брать файл из любого (другой hdfs / local filesystem /..)Оба «put» & amp; Команды copyFromLocal работают точно так же. Вы не можете использовать команду «put» для копирования файлов из одного каталога hdfs в другой. Давайте посмотрим на это с примером: скажем, ваш корень имеет две директории с именем «test1» и «test2». Если «test1» содержит файл «customer.txt», и вы попытаетесь скопировать его в каталог test2 $ hadoop fs -put /test1/customer.txt / test2 Это приведет к ошибке «нет такого файла или каталога», поскольку «put» будет найдите файл в локальной файловой системе, а не в hdf. Они предназначены только для копирования файлов (или каталогов) из локальной файловой системы в hdfs.
hadoop fs -put hdfs:///test1/customer.txt hdfs:///test2
?
– cricket_007
21 February 2018 в 03:28
Несмотря на то, что заявлено в документации, на данный момент (октябрь 2015 г.) оба -copyFromLocal
и -put
совпадают.
Из интерактивной справки:
[cloudera@quickstart ~]$ hdfs dfs -help copyFromLocal
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> :
Identical to the -put command.
И это подтверждается , глядя на источники , где вы можете видеть, что класс CopyFromLocal расширяет класс Put, но не добавляет никакого нового поведения:
public static class CopyFromLocal extends Put {
public static final String NAME = "copyFromLocal";
public static final String USAGE = Put.USAGE;
public static final String DESCRIPTION = "Identical to the -put command.";
}
public static class CopyToLocal extends Get {
public static final String NAME = "copyToLocal";
public static final String USAGE = Get.USAGE;
public static final String DESCRIPTION = "Identical to the -get command.";
}
Как вы могли заметить, это точно так же для get
/ copyToLocal
.
Давайте сделаем пример: если ваш HDFS содержит путь: /tmp/dir/abc.txt
И если ваш локальный диск также содержит этот путь, API hdfs не будет знать, какой из них вы имеете в виду, если не указать такую схему, как file://
или hdfs://
. Возможно, он выбирает путь, который вы не хотите копировать.
Поэтому у вас есть -copyFromLocal
, который мешает вам случайно скопировать неправильный файл, ограничив параметр, который вы даете локальной файловой системе.
Put
предназначен для более продвинутых пользователей, которые знают, какую схему поставить перед собой.
Это всегда немного запутывает новых пользователей Hadoop, в которых они находятся в настоящее время и где находятся их файлы.
bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath
, команда фактически не знает, существует ли /tmp/somepath
в обеих файловых системах или только в локальной файловой системе. То же самое и с маршрутом назначения.
– Thomas Jungblut
18 October 2011 в 18:58
put
от одного HDFS к другому, если хотите. -copyFromLocal
гарантирует, что он просто выбирает с локального диска и загружает в HDFS.
– Thomas Jungblut
18 October 2011 в 18:58