将具有随机生成的假数据的动态数据帧转换为静态数据帧

Convert dynamic dataframe with randomly generated fake data to static dataframe

我正在尝试将一列虚假数据添加到数据框中。 dataframe 的内容是什么并不重要。我只想添加一列随机生成的假数据,例如,每行一个名字的随机生成的名字。这是一些可以玩的虚拟数据,但我重复一遍,数据帧的内容无关紧要:

from faker import Faker

faker = Faker("en_GB")

contact = [faker.profile() for i in range(0, 100)]
contact = spark.createDataFrame(contact)

我正在尝试创建一个 class 具有针对不同列执行此操作的函数:

class anonymise:
        
    @staticmethod
    def FstName():
        def FstName_values():
            faker = Faker("en_GB")
            return faker.first_name()

        FstName_udf = udf(FstName_values, StringType())
        return FstName_udf()

上面的class有一个函数作为示例,但实际的class有多个完全相同模板的函数,只是针对不同的列,例如LastName。

然后,我将按如下方式添加新列:

contact = contact \
.withColumn("FstName", anonymise.FstName())

我正在使用此过程将真实数据替换为看起来逼真的、伪造的、随机生成的数据。

这个似乎工作正常并且运行速度很快。但是,我注意到每次显示新数据框时,它都会尝试生成一个全新的列:

第一次尝试:

第一次尝试后立即第二次尝试:

这意味着数据框不仅仅是一个带有数据的静态数据框,它会尝试为每个后续命令生成一个新列。当我尝试将数据写入外部文件时,这导致我进一步出现问题。

我只希望它使用一些易于调用的静态数据生成一次列。我什至不希望它重新生成相同的数据。生成过程应该发生一次。

我试过复制到 pandas 数据框,但数据框太大而无法正常工作(1.3+ 百万行)而且我似乎无法将较小的版本写入外部文件.

感谢任何有关此问题的帮助!

非常感谢,

卡罗莱纳州

由于您使用的是 spark,它正在跨多个节点进行计算。您可以尝试在进行匿名化后添加 contact.persist()。

您可以阅读有关坚持的更多信息HERE

所以最后这是一个非常简单的修复...

通过将 faker = Faker("en_GB") 放入函数中它所在的位置,我为每一行生成了一个 faker 的实例。我只需要将它从函数中删除并在 class 之外生成实例。所以现在,虽然它确实会在每次调用命令时生成数据,但即使对于大型数据帧,它也会非常快速地生成数据,而且我还没有 运行 处理任何后续命令的任何问题。