在Spark中重命名数据框的自连接中的列

时间:2017-01-06 05:58:37

标签: python apache-spark pyspark

我有一个如下所示的火花数据框:

+---+------------+
| 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

0 个答案:

没有答案