Ich lerne Apache Spark mit Scala und möchte es verwenden, um eine DNA-Datensatz zu verarbeiten, die mehrere Zeilen wie diese erstreckt sich über:mehrzeilige Spark-Schiebefenster
ATGTAT
ACATAT
ATATAT
ich diese in Gruppen von einer festen zuordnen möchten Größe k und zählen Sie die Gruppen. Also für k = 3, würden wir Gruppen der einzelnen Zeichen mit den nächsten zwei Zeichen erhalten:
ATG TGT GTA TAT ATA TAC
ACA CAT ATA TAT ATA TAT
ATA TAT ATA TAT
... dann die Gruppen zählen (wie Wortanzahl):
(ATA,5), (TAT,5), (TAC,1), (ACA,1), (CAT,1), (ATG,1), (TGT,1), (GTA,1)
Das Problem ist, dass Die "Wörter" umfassen mehrere Zeilen, wie im obigen Beispiel TAC
. Es umfasst den Zeilenumbruch. Ich möchte nicht nur die Gruppen in jeder Zeile zählen, sondern in der ganzen Datei Zeilenendungen ignorieren.
Mit anderen Worten, ich möchte die gesamte Sequenz als ein gleitendes Fenster der Breite k über die gesamte Datei verarbeiten, als ob es keine Zeilenumbrüche gab. Das Problem ist, in die nächste RDD-Zeile zu schauen (oder zurück), um ein Fenster zu vervollständigen, wenn ich am Ende einer Zeile angelangt bin.
Zwei Ideen, die ich hatte, waren:
- Anfügen k-1 Zeichen aus der nächsten Zeile:
ATATATAC ACATATAT ATATAT
Ich habe versucht, dies mit der Spark-SQL Leitung() Funktion , aber als ich versucht habe, eine flatMap auszuführen, habe ich eine NotSerializableException für WindowSpec bekommen. Gibt es eine andere Möglichkeit, auf die nächste Zeile zu verweisen? Müsste ich ein benutzerdefiniertes Eingabeformat schreiben?
- die gesamte Sequenz Lesen in einer einzigen Zeile (oder Verbindungslinien nach dem Lesen):
ATATATACATATATATAT
Gibt es eine Möglichkeit, mehrere zu lesen Linien, damit sie als eine verarbeitet werden können? Wenn ja, müsste alles in den Speicher einer einzelnen Maschine passen?
Ich realisiere, dass einer von diesen könnte als ein Vorverarbeitungsschritt getan werden. Ich habe mich gefragt, wie es am besten ist, es in Spark zu machen. Sobald ich es in einem dieser Formate habe, weiß ich, wie ich den Rest mache, aber ich stecke hier fest.
Ich denke, die Frage bleibt: wie kann ich auf Elemente zwei Positionen vor dem aktuellen Element zugreifen. Also, wenn ich auf dem ersten Element 'A' bin, wie kann ich nach vorne schauen, um eine Gruppe der nächsten zwei zu machen: 'ATG'? Ich weiß, wenn es in einer Zeichenfolge oder einem Array ist, kann ich basierend auf dem Index nach vorne schauen und verketten, aber was ist mit RDD-Zeilen? – jcadcell
Sie können auf [diese Antwort] verweisen (http://stackoverflow.com/questions/35154267/how-to-compute-cumulative-sum-using-spark) – Psidom
Danke, das funktioniert. Ich muss darüber nachdenken, um zu verstehen, was vor sich geht. – jcadcell