apache-spark - 将 Spark 数据框中的多行合并为一行

标签 apache-spark dataframe apache-spark-sql rdd

我有一个包含 2 列的数据框:时间戳、值 时间戳是自纪元以来的时间,值是浮点值。 我想按分钟将行合并到平均值。 这意味着我想获取时间戳来自同一轮分钟(自纪元以来间隔 60 秒)的所有行,并将它们合并到一行中,其中值列将是所有值的平均值。

举个例子,假设我的数据框如下所示:

timestamp      value
---------      -----
1441637160      10.0
1441637170      20.0
1441637180      30.0
1441637210      40.0
1441637220      10.0
1441637230      0.0

前 4 行是同一分钟的一部分 (1441637160 % 60 == 0, 1441637160 + 60 == 1441637220) 最后两行是另一分钟的一部分。 我想合并同一分钟的所有行。得到如下结果:

timestamp      value
---------      -----
1441637160      25.0  (since (10+20+30+40)/4 = 25)
1441637220      5.0   (since (10+0)/2 = 5)

最好的方法是什么?

最佳答案

您可以简单地进行分组和聚合。数据为:

val df = sc.parallelize(Seq(
  (1441637160, 10.0),
  (1441637170, 20.0),
  (1441637180, 30.0),
  (1441637210, 40.0),
  (1441637220, 10.0),
  (1441637230, 0.0))).toDF("timestamp", "value")

导入所需的函数和类:

import org.apache.spark.sql.functions.{lit, floor}
import org.apache.spark.sql.types.IntegerType

创建间隔列:

val tsGroup = (floor($"timestamp" / lit(60)) * lit(60))
  .cast(IntegerType)
  .alias("timestamp")

并用它来执行聚合:

df.groupBy(tsGroup).agg(mean($"value").alias("value")).show

// +----------+-----+
// | timestamp|value|
// +----------+-----+
// |1441637160| 25.0|
// |1441637220|  5.0|
// +----------+-----+

关于apache-spark - 将 Spark 数据框中的多行合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441506/

相关文章:

regex - Spark DataFrame `regexp_replace` 中的反向引用

Python:遍历数据框列,检查存储在数组中的条件值,并将值获取到列表

python - 如何将阈值应用于 pandas DataFrame 列并输出超出阈值的行?

python - Pandas 如何在将 DataFrame 导出为 CSV 时保留最后一个尾随零

java - 如何将 Spark Row 的数据集转换成字符串?

python - 如何从 pyspark 数据帧更快地保存 csv 文件?

sql - Spark Scala : Getting Cumulative Sum (Running Total) Using Analytical Functions

apache-spark - 分解 SQL 查询以提高 Spark 效率

python - 如何在 PySpark 中从年、月和日创建日期?

java - 将用户定义的对象转换为数据帧并写入 RDBMS - 如何维护与数据库的映射?