【问题标题】:Create function for dataframe to parquet creation为数据框创建函数以创建镶木地板
【发布时间】:2017-08-11 23:20:19
【问题描述】:

如何为数据框创建一个函数来创建拼花?

创建 parquet 文件的数据框语法类似于 - (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

如果dataframe初始化超出函数怎么办?

【问题讨论】:

  • 看起来您传递的是数据框的名称,而不是对象本身
  • 是的,我想传递数据框的名称,并在我想创建镶木地板时使用上述函数
  • 来自已经存在的数据框,还是您稍后将制作的数据框?在我看来,您不需要制作一个空的镶木地板文件,如果您已经有一个填充的数据框,则没有理由不只传入数据框对象本身
  • 如果我在内部初始化df,我的代码可以工作,但是如果df在函数外部初始化如何实现呢?
  • 我会试一试答案,我们可以编辑,直到我们得到看起来正确的东西

标签: python function dataframe pyspark


【解决方案1】:

您的代码正试图从名为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 范围内。

在我看来,这两个都是非常丑陋的解决方案,老实说,我想不出一个理由不只是传递数据框对象本身,但是你去吧。

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多