Pyspark在第二个数据框中加入多行数据框

Posted

技术标签:

【中文标题】Pyspark在第二个数据框中加入多行数据框【英文标题】:Pyspark Joining dataframes with multiple rows in the second dataframe 【发布时间】:2018-07-14 22:15:55 【问题描述】:

我想在名为“TrackID”的列上加入数据框“df_1”和“df_2”。

 df_1:   cluster    TrackID
           1           a_1
           2           a_1
           3           a_2
           1           a_3

 df_2:   TrackID     Value
           a_1         5
           a_1         6
           a_2         7
           a_2         8
           a_3         9
Output:   
         cluster    TrackID   Value
          1           a_1    Vector(5,6)
          2           a_1    Vector(5,6)
          3           a_2    Vector(7,8)
          1           a_3    Vetor(9)

我希望连接的输出看起来像这样。有什么办法可以做到吗?

【问题讨论】:

您的意思是vector(7,8) 对应a_2vector(9) 对应a_3 【参考方案1】:

如果你对ArrayType没问题,你可以先通过TrackID聚合第二个数据帧,然后再加入第一个数据帧:

import pyspark.sql.functions as F

df_2.groupBy('TrackID').agg(
    F.collect_list('Value').alias('Value')
).join(df_1, ['TrackID']).show()

+-------+------+-------+
|TrackID| Value|cluster|
+-------+------+-------+
|    a_1|[5, 6]|      1|
|    a_1|[5, 6]|      2|
|    a_2|[7, 8]|      3|
|    a_3|   [9]|      1|
+-------+------+-------+

【讨论】:

感谢您的回答。如果有人能给我一个矢量输出的解决方案,我会等待。【参考方案2】:

我只是添加一个udf 以将收集到的列表转换为@Psidom 的答案中的向量

#importing necessary libraries
from pyspark.sql.functions import udf, collect_list, col
from pyspark.ml.linalg import Vectors, VectorUDT

#udf for changing the collected list to vector
@udf(VectorUDT())
def vectorUdf(x):
    return Vectors.dense(x)

#grouping and aggregation for collecting values and calling the above udf function
vectorDf_2 = df_2.groupBy('TrackID').agg(vectorUdf(collect_list('Value')).alias('Value'))

#joining the two dataframes
Output = df_1.join(vectorDf_2, ['TrackID'])

这应该给你

+-------+-------+---------+
|TrackID|cluster|Value    |
+-------+-------+---------+
|a_1    |1      |[5.0,6.0]|
|a_1    |2      |[5.0,6.0]|
|a_2    |3      |[7.0,8.0]|
|a_3    |1      |[9.0]    |
+-------+-------+---------+

root
 |-- TrackID: string (nullable = true)
 |-- cluster: long (nullable = true)
 |-- Value: vector (nullable = true)

希望回答对你有帮助

【讨论】:

以上是关于Pyspark在第二个数据框中加入多行数据框的主要内容,如果未能解决你的问题,请参考以下文章

将列表转换为数据框,然后在 pyspark 中加入不同的数据框

在pyspark中加入具有相同列名的数据框

如何在 pyspark 中加入带有熊猫数据框的配置单元表?

为啥在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?

Pyspark 加入数据框

Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?