我有一个如下所示的火花数据框:
+---+------------+
| id| vectors|
+---+------------+
| 0| [1, 2, 3]|
| 1|[2, 4, null]|
| 2|[3, 2, null]|
+---+------------+
我想做笛卡尔式的加入。但问题是它添加了右表的相同列名。我想使用笛卡尔连接表来计算连接表的两个向量列的余弦相似度。但是如果列名相同,我将无法在余弦相似度函数中引用它们。
所以我试过了。
joined_df=data_with_keys_df.join(data_with_keys_df.withColumnRenamed('vectors','vectors_2'))
并更改了正确的表格向量列名称。
+---+------------+---+------------+
| id| vectors| id| vectors_2|
+---+------------+---+------------+
| 0| [1, 2, 3]| 0| [1, 2, 3]|
| 0| [1, 2, 3]| 1|[2, 4, null]|
| 0| [1, 2, 3]| 2|[3, 2, null]|
| 1|[2, 4, null]| 0| [1, 2, 3]|
| 1|[2, 4, null]| 1|[2, 4, null]|
| 1|[2, 4, null]| 2|[3, 2, null]|
| 2|[3, 2, null]| 0| [1, 2, 3]|
| 2|[3, 2, null]| 1|[2, 4, null]|
| 2|[3, 2, null]| 2|[3, 2, null]|
+---+------------+---+------------+
现在我可以使用Python Udf创建一个新列,它将具有上面两个向量列的余弦相似性。
但是,我仍然拥有相同的id列。在加入之前,我不想为每个表多次使用withColumnRenamed。那么有什么方法可以在加入时重命名它?
我知道这样做是sql查询将是这样一种方式,但这需要两个额外的步骤来注册数据帧作为temptable。
这可以在DataFrame语法本身完成,或者sql是最简单的方法(下面)?
select a.id as id1, a.vector as vector1, b.id as id2, b.vector as vector2
from df, df