Dataframe 如何使用来自另一个数据帧的随机值更新Pyspark中的数据帧?

Dataframe 如何使用来自另一个数据帧的随机值更新Pyspark中的数据帧?,dataframe,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我在pyspark中有两个数据帧,如下所示: 数据帧A:共1000条记录 +-----+ |Name | +-----+ | a| | b| | c| +-----+ 数据框B:共3条记录 +-----+ |Zip | +-----+ |06905| |06901| |06902| +-----+ 我需要在Dataframe a中添加一个名为Zip的新列,并使用从Dataframe B中随机选择的值填充这些值。因此Dataframe a将如下所示: +-----+----

我在pyspark中有两个数据帧,如下所示:

数据帧A:共1000条记录

+-----+
|Name |
+-----+
|    a|
|    b|
|    c|
+-----+
数据框B:共3条记录

+-----+
|Zip  |
+-----+
|06905|
|06901|
|06902|
+-----+
我需要在Dataframe a中添加一个名为Zip的新列,并使用从Dataframe B中随机选择的值填充这些值。因此Dataframe a将如下所示:

+-----+-----+
|Name |Zip  |
+-----+-----+
|    a|06901|
|    b|06905|
|    c|06902|
|    d|06902|
+-----+-----+
请帮我写这段代码。非常感谢你的帮助


我在Azure Databricks上运行这个,显然,quinn不是其中的一个模块。因此,很遗憾,不能使用quinn。

您可以使用ZIP对数据帧进行聚合,并将值收集到一个数组列中,然后进行交叉连接,并从ZIP数组中选择一个随机元素,例如,在选择第一个元素之前在数组中使用:

from pyspark.sql import functions as F

df_result = df_a.crossJoin(
    df_b.agg(F.collect_list("Zip").alias("Zip"))
).withColumn(
    "Zip",
    F.expr("shuffle(Zip)[0]")
)

#+----+-----+
#|Name|  Zip|
#+----+-----+
#|   a|06901|
#|   b|06902|
#|   c|06901|
#|   d|06901|
#+----+-----+

如果
b
很小(3行),您可以将其收集到Python列表中,并将其作为数组列添加到
a
。然后可以使用
shuffle
获得一个随机元素

import pyspark.sql.functions as F

df = a.withColumn(
    'Zip',
    F.shuffle(
        F.array(*[F.lit(r[0]) for r in b.collect()])
    )[0]
)

df.show()
+----+-----+
|Name|  Zip|
+----+-----+
|   a|06901|
|   b|06905|
|   c|06902|
|   d|06901|
+----+-----+