==
выполняет контрольную проверку равенства, ссылаясь на то, что 2 объекта (строки в этом случае) относятся к одному и тому же объекту в памяти.
Метод equals()
будет проверять, будет ли содержимое или состояния двух объектов одинаковы.
Очевидно, что ==
работает быстрее, но во многих случаях может (может) давать ложные результаты, если вы просто хотите сказать, имеет ли 2 String
s тот же текст.
Определенно рекомендуется использовать метод equals()
.
Не беспокойтесь о производительности. Некоторые способы поощрения использования String.equals()
:
String.equals()
сначала проверяет ссылочное равенство (используя ==
), и если две строки одинаковы по ссылке, дальнейший расчет Выполняется! String.equals()
будет проверять длину строк. Это также является быстрой операцией, поскольку класс String
хранит длину строки, не нужно считать символы или кодовые точки. Если длины отличаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равными. Когда все сказано и даже если у нас есть гарантия, что строки являются стажерами, использование метода equals()
все еще не является издержками, которые можно было бы подумать, определенно рекомендуемым способом. Если вам нужна эффективная проверка ссылок, используйте перечисления, где гарантируется спецификацией и реализацией языка, что одно и то же значение перечисления будет одним и тем же объектом (по ссылке).
Попробуйте использовать следующий код 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()
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)
HADOOP_CONF_DIR
? Также второе решение не является жизнеспособным для моей системы. Я в основном создаю файлы в одном каталоге (записывая их с потоком), и как только они завершатся, они должны переместиться в другой каталог. Этот различный каталог контролируется потоками Spark, и у меня были некоторые проблемы, когда Stream Spark пытается работать с незавершенными файлами. – osk 12 January 2018 в 14:57HADOOP_CONF_DIR
- это переменная окружения, поэтому вы можете искать их для своей ОС или использовать Spark, затем откройте файл spark-env.sh, и установите его там – cricket_007 12 January 2018 в 15:05