如何构建变量名称字符串?

时间:2017-01-03 15:32:09

标签: python-3.x pyspark

我正在尝试构建一个包含类对象的所有属性的字符串。对象名称为jsonData,它有一些属性,其中一些是

jsonData.Serial,
jsonData.InstrumentSerial,
jsonData.Country

我想构建一个字符串,其格式为:

'Serial InstrumentSerial Country'

最终目标是为Spark数据帧定义架构。

我对替代品持开放态度,只要我知道字符串/对象的顺序,因为我需要将模式映射到适当的值。

2 个答案:

答案 0 :(得分:2)

您必须小心过滤掉不需要的属性,但请尝试以下方法:

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

过滤掉所有“魔术方法”,例如__init____new__

要包括这些,请执行

' '.join(dir(jsonData))

这些利用了Python的dir方法,该方法返回对象的所有属性的列表。

答案 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记录列表,您希望将其视为行。 我们将它视为对象列表,但逻辑仍然是相同的。 你可以这样做:

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)

因此,前面提到的数据属性将构造为:

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