我正在尝试构建一个包含类对象的所有属性的字符串。对象名称为jsonData
,它有一些属性,其中一些是
jsonData.Serial,
jsonData.InstrumentSerial,
jsonData.Country
我想构建一个字符串,其格式为:
'Serial InstrumentSerial Country'
最终目标是为Spark数据帧定义架构。
我对替代品持开放态度,只要我知道字符串/对象的顺序,因为我需要将模式映射到适当的值。
答案 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]