将Python类对象转换为DataFrame



如何将具有实例化其他类的字段的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类以从AddressContactInfo类中提取字段:

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|
#+-----------+---------+-----------+-----------+-----------+-----------+------------+

相关内容

  • 没有找到相关文章

最新更新