2016-06-21 21 views
0

Lets sehen, was wir haben. Erste Datei [Schnittstelle Klasse]:Wie zwei Dateien über Cascading verbinden

list arrayList 
list linkedList 

Zweite Datei [Klasse countOfInstanse]:

arrayList 120 
linkedList 4 

Ich möchte diese beiden Dateien mit Schlüssel [Klasse] verbinden und für jede Schnittstelle zählen erhalten:

list 124 

und Code:

public class Main 
{ 
public static void main(String[] args) 
    { 
String docPath = args[ 0 ]; 
String wcPath = args[ 1 ]; 
String stopPath = args[ 2 ]; 

Properties properties = new Properties(); 
AppProps.setApplicationJarClass(properties, Main.class); 
AppProps.setApplicationName(properties, "Part 1"); 
AppProps.addApplicationTag(properties, "lets:do:it"); 
AppProps.addApplicationTag(properties, "technology:Cascading"); 
FlowConnector flowConnector = new Hadoop2MR1FlowConnector(properties); 

// create source and sink taps 
Tap docTap = new Hfs(new TextDelimited(true, "\t"), docPath); 
Tap wcTap = new Hfs(new TextDelimited(true, "\t"), wcPath); 

    Fields stop = new Fields("class"); 
Tap classTap = new Hfs(new TextDelimited(true, "\t"), stopPath); 

// specify a regex operation to split the "document" text lines into a token stream 
Fields token = new Fields("token"); 
Fields text = new Fields("interface"); 
RegexSplitGenerator splitter = new RegexSplitGenerator(token, "[ \\[\\]\\(\\),.]"); 
Fields fieldSelector = new Fields("interface", "class"); 
Pipe docPipe = new Each("token", text, splitter, fieldSelector); 

// define "ScrubFunction" to clean up the token stream 
Fields scrubArguments = new Fields("interface", "class"); 
docPipe = new Each(docPipe, scrubArguments, new ScrubFunction(scrubArguments), Fields.RESULTS); 



Fields text1 = new Fields("amount"); 
// RegexSplitGenerator splitter = new RegexSplitGenerator(token, "[ \\[\\]\\(\\),.]"); 
Fields fieldSelector1 = new Fields("class", "amount"); 
Pipe stopPipe = new Each("token1", text1, splitter, fieldSelector1); 
Pipe tokenPipe = new CoGroup(docPipe, token, stopPipe, text, new InnerJoin()); 
tokenPipe = new Each(tokenPipe, text, new RegexFilter("^$")); 

// determine the word counts 
Pipe wcPipe = new Pipe("wc", tokenPipe); 
wcPipe = new Retain(wcPipe, token); 
wcPipe = new GroupBy(wcPipe, token); 
wcPipe = new Every(wcPipe, Fields.ALL, new Count(), Fields.ALL); 

// connect the taps, pipes, etc., into a flow 
FlowDef flowDef = FlowDef.flowDef().setName("wc").addSource(docPipe, docTap).addSource(stopPipe, classTap).addTailSink(wcPipe, wcTap); 

// write a DOT file and run the flow 
Flow wcFlow = flowConnector.connect(flowDef); 
wcFlow.writeDOT("dot/wc.dot"); 
wcFlow.complete(); 
} 

}

Danke in advanse

[entschied ich mich dieses Problem Schritt-für-Schritt und links Endergebnis für andere hier zu lösen. Also erster Schritt - Couldn`t join two files with one key via Cascading (noch nicht abgeschlossen)]

+0

Sie müssen Ihren Code teilen, um eine sinnvolle Hilfe zu erhalten – moxn

+0

Bitte säubern Sie zuerst Ihren Code. Sie können nicht einfach alles in die Hauptmethode einfügen. Bitte teilen Sie den Code auf und schreiben Sie einen Methoden-Stub für die Aufgabe, die Sie erreichen möchten. –

+0

Ich sehe keine CoGroup, die zwei oben erwähnte Dateien in den von Ihnen geposteten Code einfügt. – Amit

Antwort

0

Ich würde die zwei Dateien in zwei Map-Objekte konvertieren, durch die Schlüssel iterieren und die Zahlen zusammenfassen. Dann können Sie sie in eine Datei zurückschreiben.

+0

Der Algorithmus ist nicht so schwer, das Problem besteht darin, zwei Karten zu verbinden. Ich arbeite mit CoGroup. Aber ich vermute, dass ich falsch liege und über die Kaskadierungsfunktion ein anderes Problem lösen muss. – user3650408

+0

Lassen Sie mich einen Beispielcode hinzufügen. –