将一列假数据添加到 pyspark 中的数据框:不支持的文字类型 class

Adding a column of fake data to a dataframe in pyspark: Unsupported literal type class

我正在尝试向我的数据集添加一个额外的新假数据列。以这个为例(数据框是什么并没有什么区别——我需要一个新的额外列,其中包含唯一的假名称;这只是一个可以玩的假人):

from faker import Faker

faker = Faker("en_GB")

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

我正在尝试添加一个新的名字列,每行一个名字。目前,我正在这样做(我知道这不会做我想要的,但我不知道还能做什么):

profiles = profiles.withColumn('first_name', lit([faker.first_name()] for _ in 'name'))

但是,我不断收到此错误:

java.lang.RuntimeException: Unsupported literal type class java.util.ArrayList [[Robin], [Margaret], [Robin], [Victor]] I'd like to keep it to one line as that's what I need for further analyses.

我想我明白为什么我会收到错误,但我不确定该怎么做...任何想法表示赞赏!

这是你想要的吗?

from faker import Faker

faker = Faker("en_GB")

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

profiles.show()

尝试这样的事情:

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from faker import Faker

faker = Faker("en_GB")

spark = SparkSession.builder.getOrCreate()
profiles = [faker.profile() for i in range(0, 100)]
profiles = spark.createDataFrame(profiles)
fake_names = [faker.first_name() for _ in range(profiles.count())]
profiles = profiles.withColumn(
    "first_name", F.udf(lambda x: fake_names[x])(F.monotonically_increasing_id())
)

需要在数据框外生成假名。如果您使用:

profiles.withColumn("first_name", F.lit(faker.first_name()))

您将获得所有行的相同假名。

  • 编辑:

row_number 示例:

fake_names = [faker.first_name() for _ in range(profiles.count())]
window = Window.orderBy("name") # Or any other unique column, but I guess name is unique here
profiles = profiles.withColumn(
    "first_name", F.udf(lambda x: fake_names[x - 1])(F.row_number().over(window))
)