出于某种背景,我试图将一个数据帧(df1
)中的行与另一数据帧(df2
)中的相似行进行匹配。我想以一个数据帧结束,该数据帧具有df1
的每一行,每一行都有df2
的行的副本。
例如,我创建了2个数据框,如下所示:
df1 df2
+-----+ +-----+
|value| |value|
+-----+ +-----+
| 0| | 2|
| 1| | 3|
+-----+ +-----+
(这些是pyspark.sql.dataframe.DataFrame
个数据帧)
最终的数据帧应如下所示:
+-----+
|value|
+-----+
| 0| <- from df1
| 2| <- clone of df2
| 3|
| 1| <- from df1
| 2| <- clone of df2
| 3|
+-----+
我尝试创建此数据框的方法是通过地图和联合。我尝试的第一步是创建df2
的重复列表,然后可以与df1
合并以创建所需的数据框。
def foo(row):
return df2.limit(2)
listOfCopies = df1.rdd.map(foo)
print(listOfCopies.take(2))
我希望listOfCopies.take(2)
的输出是2个数据帧的列表,但是我收到了错误PicklingError: Could not serialize object: TypeError: 'JavaPackage' object is not callable
我在这里做什么错了?
答案 0 :(得分:0)
正如PMende所评论的那样,我无法从函数映射df2
内部找到使用df1
的方法。相反,我最终使用了一系列连接来完成任务。
Spark的ML管道函数approxSimilarityJoin
可以满足我的要求,尽管它是为df1
和df2
具有要比较的列(例如字符串或哈希)的情况而设计的。