如何将具有实例化其他类的字段的Python类对象转换为DataFrame?我尝试了下面的代码,但它不起作用。
当我取出self.address = Address()
和self.agency_contact_info = ContactInfo()
时,我可以让它工作
class Address:
def __init__(self):
self.address_one = "address 1"
self.address_two = "P.O. BOX 1"
class ContactInfo:
def __init__(self):
self.person_name = "Me"
self.phone_number = "999-999-9999"
class AgencyRecord:
def __init__(self):
self.agency_code = "00"
self.agency_id = "000"
self.agency_name = "Some Agency"
self.address = Address()
self.agency_contact_info = ContactInfo()
def create_data():
data = {}
for i in range(0, 3):
alc = AgencyRecord()
data[i] = alc
column_list = [
'agency_code', 'agency_id', 'agency_name',
'address_one', 'address_two', 'person_name', 'phone_number'
]
spark.createDataFrame(
list(data.values()),
column_list
).createOrReplaceTempView("MyTempTable")
再次引用我自己:
我发现将createDataFrame()的参数视为[iterables]的列表是有用的,其中列表中的每个条目对应于DataFrame中的一行,[iterable]的每个元素对应于一列。
因此,您需要将每个对象转换为一个interable,其中每个元素对应于column_list
中的列。
我不一定会支持它(几乎肯定有更好的方法),但这里有一种可以相应修改代码的方法:
您可以利用以下事实:python对象有一个self.__dict__
,您可以使用它按名称检索参数。首先,更新AgencyRecord
类以从Address
和ContactInfo
类中提取字段:
class AgencyRecord:
def __init__(self):
self.agency_code = "00"
self.agency_id = "000"
self.agency_name = "Some Agency"
self.address = Address()
self.agency_contact_info = ContactInfo()
# makes the variables of the contained classes members of this class
self.__dict__.update(self.address.__dict__)
self.__dict__.update(self.agency_contact_info.__dict__)
现在,对于AgencyRecord
的任何实例,我们都可以通过名称引用column_list
中的每一列。
如下修改create_data
(我也更改了它以返回DataFrame,而不是注册临时视图)
def create_data():
data = {}
for i in range(0, 3):
alc = AgencyRecord()
data[i] = alc
column_list = [
'agency_code', 'agency_id', 'agency_name',
'address_one', 'address_two', 'person_name', 'phone_number'
]
values = [
[data[record].__dict__[c] for c in column_list]
for record in data
]
return spark.createDataFrame(values, column_list)
现在你可以做:
temp_df = create_data()
temp_df.show()
#+-----------+---------+-----------+-----------+-----------+-----------+------------+
#|agency_code|agency_id|agency_name|address_one|address_two|person_name|phone_number|
#+-----------+---------+-----------+-----------+-----------+-----------+------------+
#| 00| 000|Some Agency| address 1| P.O. BOX 1| Me|999-999-9999|
#| 00| 000|Some Agency| address 1| P.O. BOX 1| Me|999-999-9999|
#| 00| 000|Some Agency| address 1| P.O. BOX 1| Me|999-999-9999|
#+-----------+---------+-----------+-----------+-----------+-----------+------------+