Hadoop put vs copyFromLocal [дубликат]

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

45
задан snappy 18 October 2011 в 18:29
поделиться

5 ответов

  • copyFromLocal аналогичен команде put , за исключением того, что источник ограничен локальной ссылкой на файл.

Итак, в основном вы можете сделать put все, что вы делаете с copyFromLocal , но не наоборот.

Аналогично,

  • copyToLocal аналогичен команде get , за исключением того, что место назначения ограничено локальной ссылкой на файл.

Следовательно , вы можете использовать get вместо copyToLocal , но не наоборот.

Ссылка: Документация Hadoop .

Обновление: для последних, начиная с октября 2015 года, см. этот ответ ниже.

55
ответ дан Ozair Kafray 22 August 2018 в 13:27
поделиться
  • оба одинаковы, кроме
  • copyFromLocal ограничено копией из локального, в то время как put может брать файл из любого (другой hdfs / local filesystem /..)
2
ответ дан Manish Agrawal 22 August 2018 в 13:27
поделиться

Оба «put» & amp; Команды copyFromLocal работают точно так же. Вы не можете использовать команду «put» для копирования файлов из одного каталога hdfs в другой. Давайте посмотрим на это с примером: скажем, ваш корень имеет две директории с именем «test1» и «test2». Если «test1» содержит файл «customer.txt», и вы попытаетесь скопировать его в каталог test2 $ hadoop fs -put /test1/customer.txt / test2 Это приведет к ошибке «нет такого файла или каталога», поскольку «put» будет найдите файл в локальной файловой системе, а не в hdf. Они предназначены только для копирования файлов (или каталогов) из локальной файловой системы в hdfs.

0
ответ дан Roney J 22 August 2018 в 13:27
поделиться
  • 1
    Может быть, если вы укажете файловую систему в первом аргументе, она не будет читать локальную? 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.

11
ответ дан Sylvain Leroux 22 August 2018 в 13:27
поделиться

Давайте сделаем пример: если ваш HDFS содержит путь: /tmp/dir/abc.txt И если ваш локальный диск также содержит этот путь, API hdfs не будет знать, какой из них вы имеете в виду, если не указать такую ​​схему, как file:// или hdfs://. Возможно, он выбирает путь, который вы не хотите копировать.

Поэтому у вас есть -copyFromLocal, который мешает вам случайно скопировать неправильный файл, ограничив параметр, который вы даете локальной файловой системе.

Put предназначен для более продвинутых пользователей, которые знают, какую схему поставить перед собой.

Это всегда немного запутывает новых пользователей Hadoop, в которых они находятся в настоящее время и где находятся их файлы.

36
ответ дан Thomas Jungblut 22 August 2018 в 13:27
поделиться
  • 1
    Что вы подразумеваете под "API hdfs не будет знать, какой из них вы имеете в виду"? Для '-put' источник всегда является первым аргументом. Или вы имеете в виду, что некоторые пользователи могут путать «-put» с «-get»? – snappy 18 October 2011 в 18:52
  • 2
    Нет, ни пути. Мы говорим о двух разных файловых системах. HDFS и локальной файловой системы (скажем, ext4). Используя bin/hadoop fs -put /tmp/somepath /user/hadoop/somepath, команда фактически не знает, существует ли /tmp/somepath в обеих файловых системах или только в локальной файловой системе. То же самое и с маршрутом назначения. – Thomas Jungblut 18 October 2011 в 18:58
  • 3
    Таким образом, первый параметр не всегда является локальным fs, так сказать. Вы можете put от одного HDFS к другому, если хотите. -copyFromLocal гарантирует, что он просто выбирает с локального диска и загружает в HDFS. – Thomas Jungblut 18 October 2011 в 18:58
  • 4
    Зачем это нужно знать? Ваш пример команды (и вариант -copyFromLocal) всегда копирует / tmp / somepath / * из локального в / user / hadoop / somepath / * на HDFS и создает каталоги / user / hadoop / somepath, если они еще не созданы. Правильно? – snappy 18 October 2011 в 19:08
  • 5
    Нет, put предпочтет схему HDFS вместо локальной файловой системы. copyFromLocal не будет делать этого и выбрать его из локальной файловой системы. – Thomas Jungblut 19 October 2011 в 09:06
Другие вопросы по тегам:

Похожие вопросы: