在pyspark数据框中使用复制名称加入后,使用左表中的所有列进行分组

我有一个通过连接两个表获得的Spark DataFrame。他们共享“名称

”列
valuesA = [('A',1,5),('B',7,12),('C',3,6),('D',4,9)]
TableA = spark.createDataFrame(valuesA,['name','id','otherValue']).alias('ta')

valuesB = [('A',1),('A',4),2),8),('E',4)]
TableB = spark.createDataFrame(valuesB,'id']).alias('tb')

joined = TableA.join(TableB,TableA.name==TableB.name,'left')

我想对groupby执行类似于选择joined.select('ta.*').show()的操作,但是joined.groupBy('ta.*').count()会引发错误。

如何在不必显式列出列的情况下实现类似的功能? joined.groupBy(TableA.columns).count()引起了问题,因为“名称”不是唯一的

作为替代方案,如何从连接中检索具有适当别名的列?

PS做为joined = TableA.join(TableB,['name'],'left')的联接不是一个有用的解决方案,因为在联接条件中没有使用的列在表A和B中具有相同的名称

hhjuly 回答:在pyspark数据框中使用复制名称加入后,使用左表中的所有列进行分组

您始终可以使用列表推导来获取groupBy的列名列表:

aliasListTableA = ['ta.' + c for c in TableA.columns]
joined.groupBy(aliasListTableA).count().show()

输出:

+----+---+----------+-----+
|name| id|otherValue|count|
+----+---+----------+-----+
|   B|  7|        12|    2|
|   D|  4|         9|    1|
|   C|  3|         6|    1|
|   A|  1|         5|    2|
+----+---+----------+-----+

通常,我会尽量避免使用alias,因为它会隐藏列的来源:

aliasListTableA = ['ta_' + c for c in TableA.columns]
aliasListTableB = ['tb_' + c for c in TableB.columns]

joined = joined.toDF(*(aliasListTableA + aliasListTableB))
joined.show()

输出:

+-------+-----+-------------+-------+-----+
|ta_name|ta_id|ta_otherValue|tb_name|tb_id|
+-------+-----+-------------+-------+-----+
|      B|    7|           12|      B|    2|
|      B|    7|           12|      B|    8|
|      D|    4|            9|   null| null|
|      C|    3|            6|   null| null|
|      A|    1|            5|      A|    1|
|      A|    1|            5|      A|    4|
+-------+-----+-------------+-------+-----+
本文链接:https://www.f2er.com/3110311.html

大家都在问