栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SparkSQL:使用两列的条件总和

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SparkSQL:使用两列的条件总和

让您更有趣一点,以便窗口中有一些事件:

val df = sc.parallelize(Seq(  (1, "a", "2014-12-30", "2015-01-01", 100),   (2, "a", "2014-12-21", "2015-01-02", 150),  (3, "a", "2014-12-10", "2015-01-03", 120),   (4, "b", "2014-12-05", "2015-01-01", 100))).toDF("id", "prodId", "dateIns", "dateTrans", "value").withColumn("dateIns", to_date($"dateIns")).withColumn("dateTrans", to_date($"dateTrans"))

您所需要的或多或少是这样的:

import org.apache.spark.sql.functions.{col, datediff, lit, sum}// Find difference in tens of days val diff = (datediff(col("dateTrans"), col("dateIns")) / 10)  .cast("integer") * 10val dfWithDiff = df.withColumn("diff", diff)val aggregated = dfWithDiff   .where((col("diff") < 30) && (col("diff") >= 0))  .groupBy(col("prodId"), col("diff"))  .agg(sum(col("value")))

结果

aggregated.show// +------+----+----------+// |prodId|diff|sum(value)|// +------+----+----------+// |     a|  20|       120|// |     b|  20|       100|// |     a|   0|       100|// |     a|  10|       150|// +------+----+----------+

其中

diff
是范围(0-> [0,10),10-> [10,20),…)的下限。如果您删除
val
并调整了导入,这也将在PySpark中起作用。

编辑 (每列汇总):

val exprs = Seq(0, 10,  20).map(x => sum(  when(col("diff") === lit(x), col("value"))    .otherwise(lit(0)))    .alias(x.toString))dfWithDiff.groupBy(col("prodId")).agg(exprs.head, exprs.tail: _*).show// +------+---+---+---+// |prodId|  0| 10| 20|// +------+---+---+---+// |     a|100|150|120|// |     b|  0|  0|100|// +------+---+---+---+

与Python等效:

from pyspark.sql.functions import *def make_col(x):   cnd = when(col("diff") == lit(x), col("value")).otherwise(lit(0))   return sum(cnd).alias(str(x))exprs = [make_col(x) for x in range(0, 30, 10)]dfWithDiff.groupBy(col("prodId")).agg(*exprs).show()## +------+---+---+---+## |prodId|  0| 10| 20|## +------+---+---+---+## |     a|100|150|120|## |     b|  0|  0|100|## +------+---+---+---+


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号