将Python类对象转换为DataFrame

时间:2018-12-28 17:14:33

标签: python apache-spark pyspark apache-spark-sql

如何将具有实例化其他类的字段的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")

1 个答案:

答案 0 :(得分:0)

再次引用myself

  

我发现将createDataFrame()的参数视为[iterables]的列表很有用,其中列表中的每个条目都对应于DataFrame中的一行,[iterable]的每个元素都对应于一列。 / p>


因此,您需要将每个对象转换为一个互变量,其中每个元素对应于column_list中的列。

我不一定会认可它(几乎肯定是更好的方法),但是您可以采取以下一种骇人听闻的方法来相应地修改代码:

您可以利用python对象具有self.__dict__的事实,您可以使用该AgencyRecord来按名称检索参数。首先,更新您的Address类以从ContactInfoclass 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()