2017-03-21 2 views
1

I wie folgt aus wenigen Spalten ein Programm auf einem Datensatz implementieren möchten:Gruppe Datensatz in verschiedene Sub Datensätze basierend auf dem Wert

+-----------+---------------+-------------------+-----------------------+ 
|Item_ID |Product_Name |Manufacturer_Name |Product_Description | 
+-----------+---------------+-------------------+-----------------------+ 
|12345  |Pen   |Cello    |Ball Pen Soft Nib... | 
|12346  |Pencil   |Nataraja   |Pencil HB Extra D... | 
|42345  |Ruler   |Nataraja   |Scale No.1103 15c... | 
|12677  |Sharpener  |Nataraja   |Pencil Shraperner... | 
|12987  |Pen   |Reynolds   |Dot Pen Extra Gr... | 
|44326  |Pen   |Reynolds   |Gel Pen German T... | 
|13456  |Pen   |Cello    |Dot Pen 0.5mm Nib... | 
|19876  |Eraser   |Cello    |Dust free Eraser ... | 
|43246  |Ink Pen  |Hero    |Ink Pen Smooth Ha... | 
+-----------+---------------+-------------------+-----------------------+ 

und ich möchte das Dataset auf der Grundlage der Manufacturer_Name zu einer Gruppe wie gezeigt unter

Manufacturer = Cello 
+-----------+---------------+-------------------+-----------------------+ 
|Item_ID |Product_Name |Manufacturer_Name |Product_Description | 
+-----------+---------------+-------------------+-----------------------+ 
|12345  |Pen   |Cello    |Ball Pen Soft Nib... | 
|13456  |Pen   |Cello    |Dot Pen 0.5mm Nib... | 
|19876  |Eraser   |Cello    |Dust free Eraser ... | 
+-----------+---------------+-------------------+-----------------------+ 

Manufacturer = Nataraja 
+-----------+---------------+-------------------+-----------------------+ 
|Item_ID |Product_Name |Manufacturer_Name |Product_Description | 
+-----------+---------------+-------------------+-----------------------+ 
|12346  |Pencil   |Nataraja   |Pencil HB Extra D... | 
|42345  |Ruler   |Nataraja   |Scale No.1103 15c... | 
|12677  |Sharpener  |Nataraja   |Pencil Shraperner... | 
+-----------+---------------+-------------------+-----------------------+ 

Manufacturer = Reynolds 
+-----------+---------------+-------------------+-----------------------+ 
|Item_ID |Product_Name |Manufacturer_Name |Product_Description | 
+-----------+---------------+-------------------+-----------------------+ 
|12987  |Pen   |Reynolds   |Dot Pen Extra Gr... | 
|44326  |Pen   |Reynolds   |Gel Pen German T... | 
+-----------+---------------+-------------------+-----------------------+ 

Manufacturer = Hero 
+-----------+---------------+-------------------+-----------------------+ 
|Item_ID |Product_Name |Manufacturer_Name |Product_Description | 
+-----------+---------------+-------------------+-----------------------+ 
|43246  |Ink Pen  |Hero    |Ink Pen Smooth Ha... | 
+-----------+---------------+-------------------+-----------------------+ 

Ich habe versucht, mit dem folgenden Code, der nicht zu guten Ergebnissen führt. Hilf mir, dieses Programm zu verbessern. Hier ist der Code habe ich verwendet:

Dataset<Row> countsBy = src.select("Manufacturer_Name").distinct(); 
List<Row> lsts = countsBy.collectAsList(); 
for (Row lst : lsts) { 
    String man = lst.toString(); 
    System.out.println("Records of " + man + " only"); 
    Dataset<Row> mandataset = src.filter("Manufacturer_Name='" + man + "'"); 
    mandataset.show(); 
} 
+0

Können Sie über die schlechten Ergebnisse konkretisieren? War es Langsamkeit oder Fehler? –

+0

Ich möchte, dass die Teilmengen des Datasets außerhalb des Iterationsabschnitts verwendbar sind. Da es lokal deklariert ist und bei jeder Iteration überschrieben wird, kann ich nicht alle Teilmengen außer der Teilmenge verwenden, die während der letzten Iteration erzeugt wurde. @AugustinBocken –

Antwort

0

Vielleicht könnten Sie versuchen, eine Karte von Datasets zu machen, mit dem Schlüssel eine Zeichenfolge (die MANUFACTURER_NAME) und für jede Iteration, überprüfen Sie die MANUFACTURER_NAME Sie dann prüfen, ob es bereits in der Karte (Sie erstellen es bei Bedarf) und schließlich fügen Sie Ihre Zeile in den guten Dataset.

Sie werden so etwas haben:

Map<string,ArrayList<ShopItem>> dic = new HashMap<string,ArrayList<ShopItem>>(); 
for(/*...*/) 
{ 
    string Manufacturer_Name = //you get the name 
    if(/*the Manufacturer_Name is not in dic*/) 
    { 
    dic.put(Manufacturer_Name,new ArrayList<ShopItem>()); 
    } 
    dic.get(Manufacturer_Name).Add(/*what you want to add*/); 
} 

Sie benötigen dann eine zweite Schleife, aber nur für die Daten zu drucken.

Ich hoffe, es wird Ihr Problem lösen!

EDIT: remplaced Dictionnary nach Karte (sorry) und die Bereitstellung Link

How do you create a dictionary in Java?

EDIT: geänderte Code neue Idee zu passen

+0

Nur um einige Dinge vor der Umsetzung zu klären. Kann ein Dictionary instanziiert werden? und sind die Methoden Add und AddValue in Java verfügbar? –

+0

Vielleicht nur in einer Bibliothek ... Sie haben Recht, ich muss mehr überprüfen, oder Sie könnten Ihr eigenes Wörterbuch implementieren! Es ist eine Liste von Eintrag, jeder Eintrag hat ein Objekt Schlüssel und Objekt Wert, das sollte für Ihre Verwendung ausreichen ... Aber ich werde einen Blick darauf werfen und meine Antwort bearbeiten –

+0

Hier korrigierte ich die Antwort, so ist es richtiger: D –

Verwandte Themen