使用 pyspark 数据框中的复制名称加入后使用左表中的所有列进行分组
Posted
技术标签:
【中文标题】使用 pyspark 数据框中的复制名称加入后使用左表中的所有列进行分组【英文标题】:Group By using all column from left table after join with replicated names in pyspark data frame 【发布时间】:2019-11-13 11:56:43 【问题描述】:我有一个通过连接两个表获得的 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),('B',2),('B',8),('E',4)]
TableB = spark.createDataFrame(valuesB,['name','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()
引发问题,因为“名称”不是唯一的
作为替代方法,我如何从 join 中检索具有正确别名的列?
PS 以joined = TableA.join(TableB, ['name'], 'left')
身份进行联接不是一个有用的解决方案,因为我有未在联接条件中使用的列在表 A 和 B 中具有相同的名称
【问题讨论】:
【参考方案1】:您始终可以使用列表推导来获取 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|
+-------+-----+-------------+-------+-----+
【讨论】:
我很喜欢这种方法,问题是如果我需要在分析过程中多次这样做会很烦人,我最终会得到难看的列名,或者每次之后都必须清理它加入 - 按操作分组以上是关于使用 pyspark 数据框中的复制名称加入后使用左表中的所有列进行分组的主要内容,如果未能解决你的问题,请参考以下文章
读取 pyspark 数据框中的 jsonb 类型字段? [复制]