2017-01-03 2 views
0

私は、クラスオブジェクトのすべての属性を含む文字列を作成しようとしています。オブジェクト名はjsonDataであり、それらのいくつかは、私はそれらがこの形式で属性名を持つ文字列を構築したいと思います変数名の文字列を作成するにはどうすればよいですか?

jsonData.Serial, 
jsonData.InstrumentSerial, 
jsonData.Country 

である、いくつかの属性があります。

'Serial InstrumentSerial Country'

最終目標は、Sparkデータフレームのスキーマを定義することです。

スキーマを適切な値にマップする必要があるため、文字列/オブジェクトの順序がわかっている限り、私は代替手段を利用できます。

答えて

2

あなたは、不要な属性をフィルタリングについて注意する必要があり、これを試してみましょう:

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

は、それは__init__または__new__のように、すべての「マジックメソッド」を除外します。

それらを含めるには、これらのオブジェクトのすべての属性のリストを返すPythonのdir方法を活用

' '.join(dir(jsonData)) 

ください。

1

属性名を1つの文字列にグループ化する理由がわかりません。 Pythonリストの順序が保持されているので、単に属性名のリストを持つことができます。

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

そこからデータフレームを作成できます。あなたがSparkTypesを指定する必要がない場合は、あなただけにすることができます:

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

またStructTypeを作成し、スキーマ内の型を指定することができます。

jsonDataレコードのリストを、行として扱いたいと思うと思います。 これをオブジェクトのリストと見なしてみましょうが、論理は同じです。

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

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) 

ので、データ属性が以前のように構成されます言及:あなたは以下のようにそれを行うことができます

関連する問題