如何为数据框创建实木复合地板功能?
数据帧到镶木地板文件创建的语法类似于-(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的范围内。
这两种方法在我看来都是非常丑陋的解决方案,老实说,我想不出一个原因,就是不仅仅传递数据帧对象本身,而是走了。