Pyspark: экспортировать искробезопасный фрейм в конкретный локальный файл csv в Spark Standalone [дубликат]

== проверяет ссылки на объекты, .equals() проверяет строковые значения.

Иногда кажется, что == сравнивает значения, потому что Java делает некоторые закулисные вещи, чтобы убедиться, что одинаковые строки в строке являются одним и тем же объектом.

Для Например:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

Но будьте осторожны с нулями!

== обрабатывает строки null в порядке, но вызов .equals() из пустой строки приведет к исключению:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

Итак, если вы знаете, что fooString1 может но не менее очевидно, что он проверяет значение null (из Java 7):

System.out.print(Objects.equals(fooString1, "bar"));
68
задан user6910411 13 January 2018 в 03:50
поделиться

6 ответов

перераспределить / скомпилировать до 1 раздела перед сохранением (вы все равно получите папку, но в ней будет один файл детали)

2
ответ дан Arnon Rotem-Gal-Oz 17 August 2018 в 09:36
поделиться

вы можете использовать rdd.coalesce(1, true).saveAsTextFile(path)

, он будет хранить данные в виде одного файла в пути / part-00000

0
ответ дан mrsrinivas 17 August 2018 в 09:36
поделиться

Существует еще один способ использования Java

import java.io._

def printToFile(f: java.io.File)(op: java.io.PrintWriter => Unit) 
  {
     val p = new java.io.PrintWriter(f);  
     try { op(p) } 
     finally { p.close() }
  } 

printToFile(new File("C:/TEMP/df.csv")) { p => df.collect().foreach(p.println)}
-2
ответ дан Sergio Alyoshkin 17 August 2018 в 09:36
поделиться

Если вы используете Spark с HDFS, я решаю проблему, обычно записывая файлы csv и используя HDFS для слияния. Я непосредственно делаю это в Spark (1.6):

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs._

def merge(srcPath: String, dstPath: String): Unit =  {
   val hadoopConfig = new Configuration()
   val hdfs = FileSystem.get(hadoopConfig)
   FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), true, hadoopConfig, null) 
   // the "true" setting deletes the source files once they are merged into the new output
}


val newData = << create your dataframe >>


val outputfile = "/user/feeds/project/outputs/subject"  
var filename = "myinsights"
var outputFileName = outputfile + "/temp_" + filename 
var mergedFileName = outputfile + "/merged_" + filename
var mergeFindGlob  = outputFileName

    newData.write
        .format("com.databricks.spark.csv")
        .option("header", "false")
        .mode("overwrite")
        .save(outputFileName)
    merge(mergeFindGlob, mergedFileName )
    newData.unpersist()

Не могу вспомнить, где я узнал этот трюк, но он может сработать для вас.

20
ответ дан user6910411 17 August 2018 в 09:36
поделиться
  • 1
    вы можете использовать coalesce также: df.coalesce (1) .write.format ("com.databricks.spark.csv") .option ("header", "true") .save ("mydata.csv" ) – ravi 7 October 2015 в 11:31
  • 2
    spark 1.6 выдает ошибку, когда мы устанавливаем .coalesce(1), она говорит о некотором FileNotFoundException в каталоге _temporary. Это все еще ошибка в иске: issues.apache.org/jira/browse/SPARK-2984 – Harsha 26 July 2016 в 17:49
  • 3
    @ Харша Вряд ли. Скорее простой результат coalesce(1) является очень дорогостоящим и обычно непрактичным. – zero323 27 July 2016 в 15:18
  • 4
    Согласовано @ zero323, но если у вас есть специальное требование объединиться в один файл, все равно это возможно, учитывая, что у вас достаточно ресурсов и времени. – Harsha 29 July 2016 в 02:56
  • 5
    @ Харша, я не говорю, что нет. Если вы правильно настроили GC, он должен работать нормально, но это просто пустая трата времени и, скорее всего, повредит общей производительности. Поэтому я лично не вижу причин беспокоиться, потому что тривиально просто объединить файлы вне Spark, не беспокоясь об использовании памяти вообще. – zero323 29 July 2016 в 09:41
  • 6
    Любые мысли о том, как получить csv со строкой заголовка таким образом? Не хотел бы, чтобы файл создавал заголовок, так как это будет охватывать заголовки по всему файлу, по одному для каждого раздела. – nojo 23 March 2017 в 23:32
  • 7
    Может ли это работать с S3 datastores? – Josiah Yoder 27 July 2017 в 19:55
  • 8
    Я не пробовал - и подозреваю, что это может быть несложно. – Minkymorgan 13 August 2017 в 18:27
  • 9
    Благодарю. Я добавил ответ , который работает на Databricks – Josiah Yoder 14 August 2017 в 16:49
  • 10
    Есть вариант, который я использовал в прошлом, описанный здесь: markhneedham.com/blog/2014/11/30/… – etspaceman 3 September 2017 в 20:17
  • 11
    copyMerge удаляется из 3.0 libs. – woot 18 October 2017 в 03:46
  • 12
    @Minkymorgan У меня есть аналогичная проблема, но я не могу сделать это правильно .. Можете ли вы посмотреть на этот вопрос stackoverflow.com/questions/46812388/… – SUDARSHAN 23 October 2017 в 04:53
  • 13
    @SUDARSHAN. Моя функция выше работает с несжатыми данными. В вашем примере я думаю, что вы используете сжатие gzip при записи файлов, а затем - пытаетесь объединить их вместе, что не удается. Это не сработает, так как вы не можете объединить файлы gzip. Gzip не является алгоритмом Splittingable Compression, поэтому, безусловно, не «слияния». Вы можете протестировать & quot; snappy & quot; или "bz2" сжатие - но ощущение кишки - это тоже не сработает при слиянии. Вероятнее всего, лучше всего удалить сжатие, объединить необработанные файлы, а затем сжать с помощью разделяемого кодека. – Minkymorgan 23 October 2017 в 17:04
  • 14
    Спасибо @woot Я обновил ответ – etspaceman 1 November 2017 в 21:31
  • 15
    @etspaceman Cool. К сожалению, у меня все еще нет хорошего способа сделать это, поскольку мне нужно иметь возможность сделать это на Java (или Spark, но так, чтобы не потреблять много памяти и работать с большими файлами) , Я все еще не могу поверить, что они удалили этот вызов API ... это очень распространенное использование, даже если оно не совсем используется другими приложениями в экосистеме Hadoop. – woot 2 November 2017 в 13:35
101
ответ дан user6910411 6 September 2018 в 07:15
поделиться
109
ответ дан user6910411 29 October 2018 в 13:55
поделиться
Другие вопросы по тегам:

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