(pyspark)如何使没有相同用户id的Dataframe相互连接

x4shl7ld  于 2021-05-16  发布在  Spark
关注(0)|答案(2)|浏览(552)

我试图收集'2 user\u id dataframes',它们在pyspark中没有相同的user\u id。

所以,我在下面输入了一些代码你可以看到

import  pyspark.sql.functions as f

query = "select * from tb_original"
df_original = spark.sql(query)
df_original = df_original.select("user_id").distinct()

df_a = df_original.sort(f.rand()).limit(10000)
df_a.count()

# df_a: 10000

df_b = df_original.join(df_a,on="user_id",how="left_anti").sort(f.rand()).limit(10000)

df_b.count()

# df_b: 10000

df_a.join(df_b,on="user_id",how="left_anti").count()

# df_a - df_b = 9998

# What?????

因此,df\u a和df\u b具有相同的2个用户标识。。。有时是1或0。
代码看起来没问题。然而,这可能是由于spark机制的懒惰行为造成的。。。
我需要解决这个问题来收集'2 user\u id dataframes',它们相互之间没有相同的user\u id。

vsikbqxv

vsikbqxv1#

由于您希望从给定的用户池中生成两个不同的用户集,并且没有重叠,因此可以使用以下简单技巧:=

from pyspark.sql.functions import monotonically_increasing_id
import  pyspark.sql.functions as f

# "Creation of Original DF"

query = "select * from tb_original"
df_original = spark.sql(query)
df_original = df_original.select("user_id").distinct()

df_original =df.withColumn("UNIQUE_ID", monotonically_increasing_id())
number_groups_needed=2  ## you can adjust the number of group you need for your use case
dfa=df_original.filter(df_original.UNIQUE_ID % number_groups_needed ==0) 
dfb=df_original.filter(df_original.UNIQUE_ID % number_groups_needed ==1)

## dfa and dfb will not have any overlap for user_id

如果你的用户id本身是一个整数,你不需要创建一个新的唯一id列,你可以直接使用它。

qrjkbowd

qrjkbowd2#

我选择pyspark支持的“randomSplit”函数。

df_a,df_b = df_original.randomSplit([0.6,0.4])

df_a = df_a.limit(10000)
df_a.count()

# 10000

df_b = df_b.limit(10000)
df_b.count()

# 10000

df_a.join(df_b,on="user_id",how="left_anti").count()

# 10000

永远不要再在dfu a和dfu b之间发生冲突!

相关问题