如何将具有实例化其他类的字段的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")
答案 0 :(得分:0)
再次引用myself:
我发现将createDataFrame()的参数视为[iterables]的列表很有用,其中列表中的每个条目都对应于DataFrame中的一行,[iterable]的每个元素都对应于一列。 / p>
因此,您需要将每个对象转换为一个互变量,其中每个元素对应于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__)
类中提取字段:
column_list
现在,我们可以按名称引用AgencyRecord
中任何实例的create_data
中的每一列。
按如下所示修改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)
(我也将其更改为返回DataFrame,而不是注册临时视图)
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|
#+-----------+---------+-----------+-----------+-----------+-----------+------------+
现在您可以这样做:
def func():
#do a thing
return f
func()