使用Pyspark SQL函数组合4列并按一列分组

2024-10-02 00:33:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将四列(QBR、码、触地和拦截)连接或组合成一列,并使用pyspark中的sql函数f按泽西编号对它们进行分组。下面列出的是我尝试使用的编码、实际数据和预期的数据结果

import pyspark.sql.functions as f
from pyspark.sql.functions import concat, lit, col
df = df.groupby('Jersey Number).withColumn("joined", f.concat(f.col('QBR'), f.lit(','), f.col('Yards'), f.lit(','), f.col('Touchdowns'), f.lit(','), f.col('Interceptions'))
Name           Jersey Number      QBR        Yards    Touchdowns     Interceptions Fumbles
Kyler Murray       1              123.5      4120      40             6
Drew Brees         9              132.1      4500      52             12
Philip Rivers      17             120.4      3800      27             5
Andy Dalton        14             105.6      3650      22             7



Jersey Number   Stats       
    1           123.5, 4120, 40, 6
    9           132.1, 4500, 52, 12
    14          105.6, 3650, 22, 7
    17          120.4, 3800, 27, 5

Tags: 数据importnumberdfsqlcolfunctionspyspark
1条回答
网友
1楼 · 发布于 2024-10-02 00:33:28

尝试使用concat_ws, flatten, collect_list(array(cols))函数

Example:

df.show()
#+      -+  -+  -+  -+      -+
#|Jersey number|  QBR|yards|touch|intercepyions|
#+      -+  -+  -+  -+      -+
#|            1|123.5| 4120|   40|            6|
#+      -+  -+  -+  -+      -+

from pyspark.sql.functions import *

df.groupBy("Jersey number").\
agg(concat_ws(",",flatten(collect_list(array(*cols)))).alias("Stats")).\
show(10,False)
#+      -+          -+
#|Jersey number|Stats                |
#+      -+          -+
#|1            |123.5,4120.0,40.0,6.0|
#+      -+          -+

df.groupBy("Jersey number").agg(array_join(flatten(collect_list(array(*cols))),',').alias("stats")).show(10,False)
#+      -+          -+
#|Jersey number|stats                |
#+      -+          -+
#|1            |123.5,4120.0,40.0,6.0|
#+      -+          -+

import as f:

from pyspark.sql import functions as f

cols = ['QBR', 'yards', 'touch', 'intercepyions']

df.groupBy("Jersey number").agg(f.concat_ws(",",f.flatten(f.collect_list(f.array(*cols)))).alias("Stats")).show(10,False)

#or using array_join
df.groupBy("Jersey number").agg(f.array_join(f.flatten(f.collect_list(f.array(*cols))),',').alias("stats")).show(10,False)

相关问题 更多 >

    热门问题