如何在PySpark中结合GroupBy使用Round函数?
在PySpark中结合GroupBy使用Round函数的实现方法
你需要基于Spark DataFrame,通过GroupBy分组并结合Round函数计算目标结果,以下是对应需求的两种实现方式,先完成数据准备:
数据准备
首先初始化SparkSession并将示例数据转换为DataFrame:
from pyspark.sql import SparkSession from pyspark.sql.functions import count, round, col spark = SparkSession.builder.appName("GroupByRoundDemo").getOrCreate() data1 = [ {'Name':'Jhon','ID':21.528,'Add':'USA','ID_2':'30.90'}, {'Name':'Joe','ID':3.69,'Add':'USA','ID_2':'12.80'}, {'Name':'Tina','ID':2.48,'Add':'IND','ID_2':'11.07'}, {'Name':'Jhon','ID':22.22, 'Add':'USA','ID_2':'34.87'}, {'Name':'Joe','ID':5.33,'Add':'INA','ID_2':'56.89'} ] df = spark.createDataFrame(data1)
方法一:使用DataFrame API实现
通过groupBy分组后,用agg统计计数,再用withColumn结合round函数计算百分比并保留1位小数:
result_df = df.groupBy("Name") \ .agg( count("ID").alias("newid"), count("ID_2").alias("secondaryid") ) \ .withColumn( "NEW_PERCENTAGE", round( (col("newid") + col("secondaryid")) / col("newid") * 200, 1 ) ) result_df.show()
方法二:使用Spark SQL实现
先将DataFrame注册为临时视图,再执行适配Spark SQL语法的查询:
df.createOrReplaceTempView("DATA1") result_sql = spark.sql(""" SELECT count(ID) as newid, count(ID_2) as secondaryid, round( (newid + secondaryid)/newid * 200, 1 ) AS NEW_PERCENTAGE FROM DATA1 GROUP BY Name """) result_sql.show()
输出结果
两种方法会得到完全一致的结果:
+----+-----+-----------+--------------+ |Name|newid|secondaryid|NEW_PERCENTAGE| +----+-----+-----------+--------------+ |Joe | 2| 2| 400.0| |Jhon| 2| 2| 400.0| |Tina| 1| 1| 400.0| +----+-----+-----------+--------------+
内容的提问来源于stack exchange,提问作者BigData Lover
相关产品推荐
相关产品推荐

