2017-01-03 6 views
0

Ich versuche, eine Zeichenfolge zu erstellen, die alle Attribute eines Klassenobjekts enthält. Der Objektname ist jsonData und es hat ein paar Attribute, von denen einigeWie erstelle ich eine Kette von Variablennamen?

jsonData.Serial, 
jsonData.InstrumentSerial, 
jsonData.Country 

sein Ich möchte eine Zeichenfolge erstellen, die diejenigen Attributnamen im Format dieses hat:

'Serial InstrumentSerial Country'

Endziel ist die Definition eines Schemas für einen Spark-Datenrahmen.

Ich bin zu Alternativen offen, solange ich um von der Schnur/Objekt weiß, weil ich das Schema auf die entsprechenden Werte abbilden müssen.

Antwort

2

Sie werden über das Herausfiltern unerwünschter Eigenschaften vorsichtig sein, aber versuchen Sie dies:

' '.join([x for x in dir(jsonData) if '__' not in x]) 

dass filtert alle „magische Methoden“ wie __init__ oder __new__.

diejenigen gehören, tun

' '.join(dir(jsonData)) 

Diese nutzen dir Methode des Python, die eine Liste aller Attribute eines Objekts zurückgibt.

1

Ich verstehe nicht ganz, warum Sie gruppieren möchten die Attributnamen in einem einzelnen String. Sie könnten einfach eine Liste von Attributnamen haben, da die Reihenfolge einer Python-Liste persistent ist.

attribute_names = [x for x in dir(jsonData) if '__' not in x] 

Von dort können Sie Ihren Datenrahmen erstellen. Wenn Sie die SparkTypes nicht angeben müssen, können Sie einfach auf:

df = SparkContext.createDataFrame(data, schema = attribute_names) 

Sie könnten auch einen StructType erstellen und die Typen in Ihrem Schema angeben.

Ich glaube, dass Sie eine Liste von jsonData Aufzeichnungen haben werden, die Sie als Zeilen zu betrachten. Betrachten wir es als eine Liste von Objekten, aber die Logik wäre immer noch die gleiche. Sie können tun, wie folgt:

my_object_list = [ 
    jsonDataClass(Serial = 1, InstrumentSerial = 'TDD', Country = 'France'), 
    jsonDataClass(Serial = 2, InstrumentSerial = 'TDI', Country = 'Suisse'), 
    jsonDataClass(Serial = 3, InstrumentSerial = 'TDD', Country = 'Grece')] 

def build_record(obj, attr_names): 
    from operator import attrgetter 
    return attrgetter(*attr_names)(obj) 

So genannte Datenattribut vorher würde als konstruiert werden:

data = [build_record(x, attribute_names) for x in my_object_list] 
Verwandte Themen