如何为数据框创建实木复合地板功能?

数据帧到镶木地板文件创建的语法类似于-(pyspark)

df.write.mode('overwrite')。parquet(“ file_name.parquet”)

要为此创建一个函数,我正在尝试这种方式:

    def parquet_create(df_name,file_name):
        df_name.write.mode('overwrite').parquet(file_name+".parquet")
    return


但是当我运行parquet_create(“ abc”,“ eee”)...时,它失败

    AttributeError: 'str' object has no attribute 'write'


因此,我在上面插入了一个空的数据框,是否有更干净的方法来实现相同的目的?

    def parquet_create(df_name,file_name):
       df_name = sqlContext.read.json("my_empty_file.parquet")
       df_name = df_name.write.mode('overwrite').parquet(file_name+".parquet")
       return


如果数据帧在功能之外初始化,该怎么办?

最佳答案

您的代码正试图从称为df_name的数据帧创建一个实木复合地板文件,并将其作为参数传递。它接收的不是数据帧,而是字符串,因此失败。理想的情况是,您无需传入数据框的字符串名称,而是传入对象,如下所示:

df = ... # define a dataframe
filename = ... # some filename
parquet_create(df, filename)


听起来由于某种原因这不是您的选择,所以有几种解决方法。您可以创建一个将字符串数据框名称与数据框对象相关联的字典,如下所示:

df = ... # define a dataframe
df2 = ... # define another dataframe
filename = ... # some filename
name_map = {'df': df, 'df2': df2}
parquet_create('df', filename)


并这样定义parquet_create

def parquet_create(df_name, file_name):
    name_map[df_name].write.mode('overwrite').parquet(file_name+".parquet")


您将必须确保在name_map的范围内定义了parquet_create

我能想到的唯一其他选择是使用eval

df = ... # define a dataframe
filename = ... # some filename
parquet_create(df, filename)

def parquet_create(df_name, file_name):
    eval(df_name).write.mode('overwrite').parquet(file_name+".parquet")


请注意,对于该解决方案,您还必须确保df在parquet_create的范围内。

这两种方法在我看来都是非常丑陋的解决方案,老实说,我想不出一个原因,就是不仅仅传递数据帧对象本身,而是走了。

10-06 05:21
查看更多