【发布时间】:2019-04-19 12:43:17
【问题描述】:
可以按如下方式进行交叉连接:
df1 = pd.DataFrame({'subgroup':['A','B','C','D']})
df2 = pd.DataFrame({'dates':pd.date_range(date_today, date_today + timedelta(3), freq='D')})
sdf1 = spark.createDataFrame(df1)
sdf2 = spark.createDataFrame(df2)
sdf1.crossJoin(sdf2).toPandas()
在此示例中,有两个数据框,每个数据框包含 4 行,最后我得到 16 行。
但是,对于我的问题,我想对每个用户进行交叉连接,并且用户是两个数据框中的另一列,例如:
df1 = pd.DataFrame({'user':[1,1,1,1,2,2,2,2],'subgroup':['A','B','C','D','A','B','D','E']})
df2 = pd.DataFrame({'user':[1,1,1,1,2,2,2,2],'dates':np.hstack([np.array(pd.date_range(date_today, date_today + timedelta(3), freq='D')),np.array(pd.date_range(date_today+timedelta(1), date_today + timedelta(4), freq='D'))])})
应用 per-user crossJoin 的结果应该是一个 32 行的数据框。这在 pyspark 中是否可行?如何做到这一点?
【问题讨论】:
-
将每个数据帧过滤成两个,每个用户一个,交叉连接对应的子数据帧(得到2个数据帧,每个16行)然后合并两个交叉连接的数据帧
-
@sramalingam24 ,我应该提到这应该推广到 n 个用户(即超过 2 个)
-
那么你将不得不编写一个函数,在用户 ID 的范围内执行此操作,最好是在 map (filter&join) - reduce (union) 方式中
-
在一系列用户 ID 上执行此操作确实是一个解决方案,如果这可以通过 map reduce 方式完成的话。如何做到这一点?
-
如果您可以将您的问题减少到最小的实例并提供示例数据和示例输出,以便我们准确了解您想要实现的目标,我会非常有帮助。
标签: apache-spark pyspark pyspark-sql