Снова цитируя себя :
Я считаю полезным думать об аргументе createDataFrame () как о списке [iterables], где каждая запись в списке соответствуетстрока в DataFrame, и каждый элемент [iterable] соответствует столбцу.
Таким образом, вам нужно преобразовать каждый из ваших объектов в целое, где каждый элемент соответствует столбцам в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
следующим образом (я также изменил это для возврата 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|
#+-----------+---------+-----------+-----------+-----------+-----------+------------+