Как скопировать файлы из одного каталога HDFS в другой HDFS Dir в искровом / скале ETL Job [duplicate]

== выполняет контрольную проверку равенства, ссылаясь на то, что 2 объекта (строки в этом случае) относятся к одному и тому же объекту в памяти.

Метод equals() будет проверять, будет ли содержимое или состояния двух объектов одинаковы.

Очевидно, что == работает быстрее, но во многих случаях может (может) давать ложные результаты, если вы просто хотите сказать, имеет ли 2 String s тот же текст.

Определенно рекомендуется использовать метод equals().

Не беспокойтесь о производительности. Некоторые способы поощрения использования String.equals():

  1. Реализация String.equals() сначала проверяет ссылочное равенство (используя ==), и если две строки одинаковы по ссылке, дальнейший расчет Выполняется!
  2. Если 2 ссылки на строки не совпадают, String.equals() будет проверять длину строк. Это также является быстрой операцией, поскольку класс String хранит длину строки, не нужно считать символы или кодовые точки. Если длины отличаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равными.
  3. Только если мы доберемся до этого, будет фактически сопоставлено содержимое двух строк, и это будет короткий сравнение: не все символы будут сравниваться, если мы найдем несоответствующий символ (в том же положении в 2 строках), никакие другие символы не будут проверены.

Когда все сказано и даже если у нас есть гарантия, что строки являются стажерами, использование метода equals() все еще не является издержками, которые можно было бы подумать, определенно рекомендуемым способом. Если вам нужна эффективная проверка ссылок, используйте перечисления, где гарантируется спецификацией и реализацией языка, что одно и то же значение перечисления будет одним и тем же объектом (по ссылке).

0
задан cricket_007 12 January 2018 в 15:08
поделиться

2 ответа

Попробуйте использовать следующий код Scala.

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

val hadoopConf = new Configuration()
val hdfs = FileSystem.get(hadoopConf)

val srcPath = new Path(srcFilePath)
val destPath = new Path(destFilePath)

hdfs.copyFromLocalFile(srcPath, destPath)

Вы также должны проверить, имеет ли Spark переменную HADOOP_CONF_DIR, установленную в файле conf / spark-env.sh. Это гарантирует, что Spark найдет настройки конфигурации Hadoop.

Зависимости для файла build.sbt:

libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "2.6.0"
libraryDependencies += "org.apache.commons" % "commons-io" % "1.3.2"
libraryDependencies += "org.apache.hadoop" % "hadoop-hdfs" % "2.6.0"

ИЛИ

вы может использовать IOUtils из apache commons для копирования данных из InputStream в OutputStream

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.commons.io.IOUtils;



val hadoopconf = new Configuration();
val fs = FileSystem.get(hadoopconf);

//Create output stream to HDFS file
val outFileStream = fs.create(new Path("hdfs://<namenode>:<port>/output_path"))

//Create input stream from local file
val inStream = fs.open(new Path("hdfs://<namenode>:<port>/input_path"))

IOUtils.copy(inStream, outFileStream)

//Close both files
inStream.close()
outFileStream.close()
1
ответ дан Sahil Desai 16 August 2018 в 05:45
поделиться
  • 1
    Непосредственно первое решение не работает, как я могу проверить, установлен ли HADOOP_CONF_DIR? Также второе решение не является жизнеспособным для моей системы. Я в основном создаю файлы в одном каталоге (записывая их с потоком), и как только они завершатся, они должны переместиться в другой каталог. Этот различный каталог контролируется потоками Spark, и у меня были некоторые проблемы, когда Stream Spark пытается работать с незавершенными файлами. – osk 12 January 2018 в 14:57
  • 2
    @osk В вашем вопросе не упоминается Spark ... И HADOOP_CONF_DIR - это переменная окружения, поэтому вы можете искать их для своей ОС или использовать Spark, затем откройте файл spark-env.sh, и установите его там – cricket_007 12 January 2018 в 15:05
  • 3
    @Sahil, я работаю над одним и тем же решением и пытаюсь найти способ скопировать большой набор данных в распределенном виде, так как я вижу, что IOUtils - это пакет без хаоса org.apache.commons.io.IOUtils, он может не работать в распределенным образом. Не могли бы вы подтвердить, что IOUtis может работать в распределенной копии файла. Я пытаюсь скопировать файлы файлов в HDFS в другой каталог HDFS на том же кластере – Srinivas Bandaru 22 July 2018 в 16:20
import org.apache.hadoop.fs.{FileAlreadyExistsException, FileSystem, FileUtil, Path}

val srcFileSystem: FileSystem = FileSystemUtil
  .apply(spark.sparkContext.hadoopConfiguration)
  .getFileSystem(sourceFile)
val dstFileSystem: FileSystem = FileSystemUtil
  .apply(spark.sparkContext.hadoopConfiguration)
  .getFileSystem(sourceFile)
FileUtil.copy(
  srcFileSystem,
  new Path(new URI(sourceFile)),
  dstFileSystem,
  new Path(new URI(targetFile)),
  true,
  spark.sparkContext.hadoopConfiguration)
0
ответ дан Yordan Georgiev 16 August 2018 в 05:45
поделиться
Другие вопросы по тегам:

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