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