2016-07-07 6 views
13

Ich versuche, eine Zeile in pySpark 1.6.1 dynamisch zu erstellen, und dann in einen Datenrahmen zu bauen. Die allgemeine Idee besteht darin, die Ergebnisse von describe so auszudehnen, dass sie beispielsweise Skew und Kurtosis einschließt. Hier ist, was ich dachte funktionieren sollte:Erstellen einer Zeile aus einem Diktat in pySpark

from pyspark.sql import Row 

row_dict = {'C0': -1.1990072635132698, 
      'C3': 0.12605772684660232, 
      'C4': 0.5760856026559944, 
      'C5': 0.1951877800894315, 
      'C6': 24.72378589441825, 
      'summary': 'kurtosis'} 

new_row = Row(row_dict) 

Aber das gibt TypeError: sequence item 0: expected string, dict found die eine ziemlich klare Fehler. Dann fand ich, dass, wenn ich die Zeile Felder zuerst definiert sind, ein dict verwenden:

r = Row('summary', 'C0', 'C3', 'C4', 'C5', 'C6') 
r(row_dict) 
> Row(summary={'summary': 'kurtosis', 'C3': 0.12605772684660232, 'C0': -1.1990072635132698, 'C6': 24.72378589441825, 'C5': 0.1951877800894315, 'C4': 0.5760856026559944}) 

die einen feinen Schritt sein würde, es sei denn es scheint nicht, wie ich dynamisch die Felder in angeben können. Ich brauche das für eine unbekannte Anzahl von Zeilen mit unbekannten Namen. Gemäß der Dokumentation können Sie tatsächlich in die andere Richtung gehen:

>>> Row(name="Alice", age=11).asDict() == {'name': 'Alice', 'age': 11} 
True 

So scheint es, wie ich in der Lage sein sollte, dies zu tun. Es scheint auch, dass einige veraltete Features von älteren Versionen, die dies erlaubt, zum Beispiel here. Gibt es ein aktuelleres Äquivalent, das ich vermisse?

Antwort

17

können Sie Keyword-Argumente verwenden Auspacken wie folgt:

Row(**row_dict) 

## Row(C0=-1.1990072635132698, C3=0.12605772684660232, C4=0.5760856026559944, 
##  C5=0.1951877800894315, C6=24.72378589441825, summary='kurtosis') 

Es ist wichtig zu beachten, dass es internally sorts data by keyproblems with older Python versions zu adressieren.

+0

Ist das von einer bestimmten Version von Python gültig oder ist es eine allgemeine Regel? Der Grund, warum ich frage, ist aufgrund Ihrer [letzten Bearbeitung] (https://stackoverflow.com/posts/38253641/revisions). – eliasah

+1

@eliasah Da Spark immer intern sortiert, ist es egal, was wir vorher machen. Und bei der JIRA-Diskussion wird sich nichts ändern, bis Spark die Unterstützung für Python <3.6 (in absehbarer Zeit nicht mehr) fallen lässt. 'OrderedDict' war ein bisschen irreführend, daher habe ich es entfernt. – zero323

+0

Ok danke! Das war der Ursprung meiner Verwirrung. – eliasah

1

Wenn das Diktat nicht abgeflacht ist, können Sie dict in Row rekursiv konvertieren.

def as_row(obj): 
    if isinstance(obj, dict): 
     dictionary = {k: as_row(v) for k, v in obj.items()} 
     return Row(**dictionary) 
    elif isinstance(obj, list): 
     return [as_row(v) for v in obj] 
    else: 
     return obj 
Verwandte Themen