Python 3.x 如何构建变量名字符串?
我试图构建一个包含类对象所有属性的字符串。对象名是Python 3.x 如何构建变量名字符串?,python-3.x,pyspark,Python 3.x,Pyspark,我试图构建一个包含类对象所有属性的字符串。对象名是jsonData,它有几个属性,其中一些属性是 jsonData.Serial, jsonData.InstrumentSerial, jsonData.Country 我想构建一个字符串,其中包含以下格式的属性名称: “串行仪表串行国家/地区” 最终目标是为Spark数据帧定义一个模式 只要我知道字符串/对象的顺序,我愿意选择其他方法,因为我需要将架构映射到适当的值。您必须小心筛选出不需要的属性,但请尝试以下方法: ' '.join([x f
jsonData
,它有几个属性,其中一些属性是
jsonData.Serial,
jsonData.InstrumentSerial,
jsonData.Country
我想构建一个字符串,其中包含以下格式的属性名称:
“串行仪表串行国家/地区”
最终目标是为Spark数据帧定义一个模式
只要我知道字符串/对象的顺序,我愿意选择其他方法,因为我需要将架构映射到适当的值。您必须小心筛选出不需要的属性,但请尝试以下方法:
' '.join([x for x in dir(jsonData) if '__' not in x])
它过滤掉了所有的“神奇方法”,比如\uuuuu init\uuuuuu
或\uuuu new\uuuuuuu
要包含这些,请执行以下操作:
' '.join(dir(jsonData))
这些方法利用了Python的
dir
方法,该方法返回一个对象的所有属性列表。您必须小心过滤掉不需要的属性,但请尝试以下方法:
' '.join([x for x in dir(jsonData) if '__' not in x])
它过滤掉了所有的“神奇方法”,比如\uuuuu init\uuuuuu
或\uuuu new\uuuuuuu
要包含这些,请执行以下操作:
' '.join(dir(jsonData))
它们利用了Python的
dir
方法,该方法返回一个对象所有属性的列表。我不太明白为什么要将属性名称分组到一个字符串中。
您可以简单地拥有一个属性名列表,因为python列表的顺序是持久的
attribute_names = [x for x in dir(jsonData) if '__' not in x]
从那里您可以创建数据帧。如果不需要指定SparkTypes,您可以:
df = SparkContext.createDataFrame(data, schema = attribute_names)
您还可以创建一个StructType
,并在模式中指定类型
我猜你会有一个清单,列出你想把它看作行的代码> JSONDATA < /Cord>记录。 让我们把它看作一个对象列表,但逻辑仍然是一样的。 您可以按如下方式执行此操作:
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]
我不太明白为什么要将属性名分组在一个字符串中。 您可以简单地拥有一个属性名列表,因为python列表的顺序是持久的
attribute_names = [x for x in dir(jsonData) if '__' not in x]
从那里您可以创建数据帧。如果不需要指定SparkTypes,您可以:
df = SparkContext.createDataFrame(data, schema = attribute_names)
您还可以创建一个StructType
,并在模式中指定类型
我猜你会有一个清单,列出你想把它看作行的代码> JSONDATA < /Cord>记录。 让我们把它看作一个对象列表,但逻辑仍然是一样的。 您可以按如下方式执行此操作:
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]