apache-spark - titel - title tag definition




Wie man gut reproduzierbare Apache Spark Beispiele macht (3)

Ich habe pyspark viel Zeit damit verbracht, einige Fragen mit den pyspark und spark-dataframe Tags zu spark-dataframe und sehr oft spark-dataframe ich fest, dass Poster nicht genügend Informationen enthalten, um ihre Frage wirklich zu verstehen. Normalerweise kommentiere ich, dass sie gebeten werden, ein MCVE zu MCVE aber manchmal ist es, sie zu veranlassen, einige Beispiel-Eingabe- / Ausgabedaten MCVE , wie Zähne zu ziehen. Zum Beispiel: Siehe die Kommentare zu dieser Frage .

Möglicherweise liegt ein Teil des Problems darin, dass die Leute einfach nicht wissen, wie ein MCVE für Spark-Datenrahmen einfach zu erstellen ist. Ich denke, es wäre nützlich, eine Spark-Dataframe-Version dieser Pandas-Frage als Leitfaden zu haben, die verlinkt werden kann.

Wie schafft man ein gutes, reproduzierbares Beispiel?


Leistungsoptimierung

Wenn sich die Frage auf die Leistungsoptimierung bezieht, geben Sie bitte die folgenden Informationen an.

Ausführungsplan

Es ist am besten, einen erweiterten Ausführungsplan beizufügen . In Python:

df.explain(True) 

In Scala:

df.explain(true)

oder erweiterter Ausführungsplan mit Statistik . In Python:

print(df._jdf.queryExecution().stringWithStats())

in Scala:

df.queryExecution.stringWithStats

Modus- und Clusterinformationen

  • mode - local , client , Cluster.
  • Cluster-Manager (falls zutreffend) - keiner (lokaler Modus), Standalone, YARN, Mesos, Kubernetes.
  • Grundlegende Konfigurationsinformationen (Anzahl der Kerne, Executor-Speicher).

Timing-Informationen

slow ist relativ, insbesondere wenn Sie nicht verteilte Anwendungen portieren oder eine geringe Latenz erwarten. Genaue Zeitabläufe für verschiedene Aufgaben und Phasen können aus Spark-UI- jobs ( sc.uiWebUrl ) oder der Spark-REST-UI abgerufen werden.

Verwenden Sie für Kontexte standardisierte Namen

Durch die Verwendung festgelegter Namen für jeden Kontext können wir das Problem schnell reproduzieren.

  • sc - für SparkContext .
  • sqlContext - für SQLContext .
  • spark - für SparkSession .

Typinformationen bereitstellen ( Scala )

Leistungsstarke Typinferenz ist eine der nützlichsten Funktionen von Scala, aber es ist schwierig, Code zu analysieren, der aus dem Kontext entfernt wurde. Auch wenn der Typ aus dem Kontext ersichtlich ist, ist es besser, die Variablen mit Anmerkungen zu versehen. Bevorzugen

val lines: RDD[String] = sc.textFile("path")
val words: RDD[String] = lines.flatMap(_.split(" "))

Über

val lines = sc.textFile("path")
val words = lines.flatMap(_.split(" "))

Häufig verwendete Tools können Ihnen dabei helfen:

  • spark-shell / Scala-Muschel

    Verwenden Sie :t

    scala> val rdd = sc.textFile("README.md")
    rdd: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at <console>:24
    
    scala> :t rdd
    org.apache.spark.rdd.RDD[String]
    
  • InteliJ Idea

    Verwenden Sie Alt + =


Stellen Sie kleine Beispieldaten bereit, die einfach wiederhergestellt werden können.

Zumindest sollten Poster einige Zeilen und Spalten in ihrem Datenrahmen und Code enthalten, mit denen sie einfach erstellt werden können. Mit einfach meine ich Ausschneiden und Einfügen. Machen Sie es so klein wie möglich, um Ihr Problem zu demonstrieren.

Ich habe folgenden Datenrahmen:

+-----+---+-----+----------+
|index|  X|label|      date|
+-----+---+-----+----------+
|    1|  1|    A|2017-01-01|
|    2|  3|    B|2017-01-02|
|    3|  5|    A|2017-01-03|
|    4|  7|    B|2017-01-04|
+-----+---+-----+----------+

was kann mit diesem Code erstellt werden:

df = sqlCtx.createDataFrame(
    [
        (1, 1, 'A', '2017-01-01'),
        (2, 3, 'B', '2017-01-02'),
        (3, 5, 'A', '2017-01-03'),
        (4, 7, 'B', '2017-01-04')
    ],
    ('index', 'X', 'label', 'date')
)

Zeigen Sie die gewünschte Ausgabe an.

Stellen Sie Ihre spezifische Frage und zeigen Sie uns Ihre gewünschte Ausgabe.

Wie kann ich eine neue Spalte 'is_divisible' , die den Wert 'yes' wenn der Tag des Monats des 'date' plus 7 Tage durch den Wert in Spalte 'X' teilbar ist und andernfalls 'no' ?

Gewünschte Ausgabe:

+-----+---+-----+----------+------------+
|index|  X|label|      date|is_divisible|
+-----+---+-----+----------+------------+
|    1|  1|    A|2017-01-01|         yes|
|    2|  3|    B|2017-01-02|         yes|
|    3|  5|    A|2017-01-03|         yes|
|    4|  7|    B|2017-01-04|          no|
+-----+---+-----+----------+------------+

Erläutern Sie, wie Sie Ihre Ausgabe erhalten.

Erläutern Sie ausführlich, wie Sie die gewünschte Ausgabe erhalten. Es hilft, eine Beispielberechnung zu zeigen.

Zum Beispiel in Zeile 1 ist X = 1 und Datum = 2017-01-01. Addiert man die bisherigen 7 Tage, ergibt sich 2017-01-08. Der Tag des Monats ist 8 und da 8 durch 1 teilbar ist, lautet die Antwort "Ja".

Ebenso für die letzte Zeile X = 7 und das Datum = 2017-01-04. Wenn Sie dem Datum 7 hinzufügen, erhalten Sie 11 als Tag des Monats. Da 11% 7 nicht 0 ist, lautet die Antwort "Nein".

Teilen Sie Ihren vorhandenen Code.

Zeigen Sie uns, was Sie getan oder versucht haben, einschließlich des gesamten Codes *, auch wenn dieser nicht funktioniert. Teilen Sie uns mit, wo Sie stecken bleiben. Wenn Sie eine Fehlermeldung erhalten, geben Sie diese bitte an.

(* Sie können den Code zum Erstellen des Spark-Kontexts weglassen, sollten jedoch alle Importe einschließen.)

Ich kann eine neue Spalte hinzufügen, die aus date und 7 Tagen besteht, habe jedoch Probleme, den Tag des Monats als Ganzzahl zu ermitteln.

from pyspark.sql import functions as f
df.withColumn("next_week", f.date_add("date", 7))

Schließen Sie Versionen, Importe und Syntaxhervorhebungen ein

  • desertnaut Details in dieser Antwort von desertnaut .

Fügen Sie für Beiträge zur Leistungsoptimierung den Ausführungsplan hinzu

  • Vollständige Details in dieser Antwort von user8371915 .
  • Es ist hilfreich, standardisierte Namen für Kontexte zu verwenden.

Analysieren von Spark-Ausgabedateien

  • MaxU hat in dieser Antwort nützlichen Code bereitgestellt, um Spark-Ausgabedateien in einen DataFrame zu analysieren.

Weitere Hinweise.

  • Lesen Sie zuerst, wie Sie Fragen stellen und MCVE .
  • Lesen Sie die anderen Antworten auf diese Frage, die oben verlinkt sind.
  • Haben Sie einen guten, beschreibenden Titel.
  • Höflich sein. Leute auf SO sind Freiwillige, also frage nett.

Gute Frage & Antwort; einige zusätzliche Vorschläge:

Fügen Sie Ihre Spark-Version hinzu

Spark entwickelt sich immer noch, wenn auch nicht so schnell wie in den Tagen von 1.x. Es ist immer eine gute Idee (vor allem, wenn Sie eine etwas ältere Version verwenden), Ihre Arbeitsversion einzuschließen. Persönlich beginne ich meine Antworten immer mit:

spark.version
# u'2.2.0'

oder

sc.version
# u'2.2.0'

Es ist nie eine schlechte Idee, auch Ihre Python-Version einzubeziehen.

Schließen Sie alle Ihre Importe ein

Wenn sich Ihre Frage nicht ausschließlich auf Spark SQL und Datenrahmen bezieht, z. B. wenn Sie beabsichtigen, Ihren Datenrahmen in einem maschinellen Lernvorgang zu verwenden, beziehen Sie sich explizit auf Ihre Importe - siehe diese Frage , bei der die Importe im OP erst nach einem umfassenden Austausch im OP hinzugefügt wurden (Jetzt entfernt) Kommentare (und es stellte sich heraus, dass diese falschen Importe die Hauptursache des Problems waren).

Warum ist das notwendig? Weil zum Beispiel diese LDA

from pyspark.mllib.clustering import LDA

unterscheidet sich von dieser LDA:

from pyspark.ml.clustering import LDA

Die erste stammt von der alten RDD-basierten API (ehemals Spark MLlib), die zweite von der neuen datenrahmenbasierten API (Spark ML).

Code-Hervorhebung einschließen

OK, ich gebe zu, dass dies subjektiv ist: Ich glaube, dass PySpark-Fragen nicht standardmäßig als python markiert werden sollten. Die Sache ist, python Tag gibt automatisch Code-Hervorhebung (und ich glaube, dies ist ein Hauptgrund für diejenigen, die es für PySpark-Fragen verwenden). Wie auch immer, wenn Sie zustimmen und trotzdem einen schönen, hervorgehobenen Code wünschen, fügen Sie einfach die entsprechende Markdown-Direktive hinzu:

<!-- language-all: lang-python -->

Irgendwo in deinem Post, vor deinem ersten Code-Snippet.

[UPDATE: meta..com/questions/362624/… automatische Syntaxhervorhebung für pyspark und sparkr Tags angefordert.





pyspark-sql