将具有随机生成的假数据的动态数据帧转换为静态数据帧
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 之外生成实例。所以现在,虽然它确实会在每次调用命令时生成数据,但即使对于大型数据帧,它也会非常快速地生成数据,而且我还没有 运行 处理任何后续命令的任何问题。
我正在尝试将一列虚假数据添加到数据框中。 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 之外生成实例。所以现在,虽然它确实会在每次调用命令时生成数据,但即使对于大型数据帧,它也会非常快速地生成数据,而且我还没有 运行 处理任何后续命令的任何问题。