如何不使用pandas将生成随机值的pandas代码转换为PySpark DataFrame实现
PySpark随机生成DataFrame实现方案
你可以根据数据量大小选择以下两种实现方式,全程不依赖pandas:
方案1:小数据量场景(仅需少量样本)
直接在本地生成随机数据后转PySpark DataFrame,写法最简单:
import random from pyspark.sql import SparkSession # 初始化SparkSession(已初始化可跳过) spark = SparkSession.builder.appName("test").getOrCreate() # 定义各列候选值 name_list = ["Alex","James","Michael","Peter","Harry"] fruit_list = ["Apple","Grapes","Orange","Pear","Kiwi"] # 生成3条随机数据 raw_data = [ ( random.choice(name_list), random.randint(1, 9), random.choice(fruit_list) ) for _ in range(3) ] # 转PySpark DataFrame并指定字段名 df = spark.createDataFrame(raw_data, schema=["Name", "ID", "Fruit"]) # 查看结果 df.show()
方案2:大数据量场景(需生成大量数据)
全程使用PySpark分布式API执行,不会占用本地内存,性能更高:
from pyspark.sql import SparkSession from pyspark.sql.functions import rand, array, lit, element_at, randint # 初始化SparkSession(已初始化可跳过) spark = SparkSession.builder.appName("large_random_gen").getOrCreate() # 生成指定行数的基础数据集,修改range参数即可调整生成行数 df = spark.range(3).toDF("aux_id") # 生成Name列:从指定姓名列表随机取值 name_arr = array(*[lit(name) for name in ["Alex","James","Michael","Peter","Harry"]]) df = df.withColumn("Name", element_at(name_arr, (rand()*5 + 1).cast("int"))) # 生成ID列:1~9的随机整数,和原numpy randint逻辑完全一致 df = df.withColumn("ID", randint(low=1, high=10)) # 生成Fruit列:从指定水果列表随机取值 fruit_arr = array(*[lit(fruit) for fruit in ["Apple","Grapes","Orange","Pear","Kiwi"]]) df = df.withColumn("Fruit", element_at(fruit_arr, (rand()*5 + 1).cast("int"))) # 删除辅助列得到最终结果 df = df.drop("aux_id") # 查看结果 df.show()
效果示例
运行后输出结果和你要求的格式一致:
+-------+---+------+ | Name| ID| Fruit| +-------+---+------+ | Alex| 3| Apple| | James| 6|Grapes| | Harry| 5| Pear| +-------+---+------+
补充说明
如果需要固定随机结果便于复现,可以给随机函数传入固定种子,比如rand(seed=123)、randint(low=1, high=10, seed=123),每次运行都会得到相同的随机值。
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

