首页 > 解决方案 > SQL - 如何对数组的元素求和?

问题描述

我正在将 SQL 与 pyspark 和 hive 一起使用,而且我对这一切都很陌生。我有一个带有字符串类型列的配置单元表,如下所示:

id | values
1  | '2;4;4'
2  |  '5;1'
3  |  '8;0;4'

我想创建一个查询来获得这个:

id | values | sum
1  | '2.2;4;4'  | 10.2
2  |  '5;1.2' |  6.2
3  |  '8;0;4' | 12

通过使用 split(values, ';') 我可以得到像 ['2.2','4','4'] 这样的数组,但我仍然需要将它们转换为十进制数并将它们相加。有没有一种不太复杂的方法来做到这一点?

非常感谢您提前!祝大家编码愉快:)

标签: sqlcsvpysparkhivepyspark-sql

解决方案


Spark-2.4+

我们不必explode在数组上使用,而是直接在数组上使用高阶函数

Example:

from pyspark.sql.functions import *

df=spark.createDataFrame([("1","2;4;4"),("2","5;1"),("3","8;0;4")],["id","values"])

#split and creating array<int> column
df1=df.withColumn("arr",split(col("values"),";").cast("array<int>"))

df1.createOrReplaceTempView("tmp")

spark.sql("select *,aggregate(arr,0,(x,y) -> x + y) as sum from tmp").drop("arr").show()
#+---+------+---+
#| id|values|sum|
#+---+------+---+
#|  1| 2;4;4| 10|
#|  2|   5;1|  6|
#|  3| 8;0;4| 12|
#+---+------+---+

#in dataframe API

df1.selectExpr("*","aggregate(arr,0,(x,y) -> x + y) as sum").drop("arr").show()
#+---+------+---+
#| id|values|sum|
#+---+------+---+
#|  1| 2;4;4| 10|
#|  2|   5;1|  6|
#|  3| 8;0;4| 12|
#+---+------+---+

推荐阅读