sql - 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'] 这样的数组,但我仍然需要将它们转换为十进制数并将它们相加。有没有一种不太复杂的方法来做到这一点?
非常感谢您提前!祝大家编码愉快:)
解决方案
从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|
#+---+------+---+
推荐阅读
- r - 按照特定模式更改多个变量名称
- python - 防止直接访问 Django 中的媒体文件
- angular - 如何有条件地为 ngx-datatable 的单元格着色
- conv-neural-network - CNN 只有 2 个 ConvLayer 时的批量归一化?
- mongodb - MongoDB - 是否可以通过 _id 字段比较文档?
- css - 使用 @extend 时,Sass 将所有选择器应用于样式块
- angular - 如何从日期数组中禁用 Angular Material Datepicker 日期?
- ios - UITextView 不会更改 textColor 属性
- javascript - 拉刷新不更新列表
- c++ - 添加这些字符串有什么区别?