Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 获取时间戳数据的每周和每日平均值_Apache Spark_Dataframe_Apache Spark Sql_Sql Timestamp - Fatal编程技术网

Apache spark 获取时间戳数据的每周和每日平均值

Apache spark 获取时间戳数据的每周和每日平均值,apache-spark,dataframe,apache-spark-sql,sql-timestamp,Apache Spark,Dataframe,Apache Spark Sql,Sql Timestamp,我目前拥有Spark数据框上的数据,其格式如下: Timestamp Number ......... ...... M-D-Y 3 M-D-Y 4900 时间戳数据绝不统一或一致(即,我可能有一个值出现在2015年3月1日,表中的下一个值是2015年9月1日……此外,我可能有多个条目) 所以我想做两件事 计算每周的条目数。因此,我需要一个新表,它表示时间戳列在该行对应的周中的行数。如果存在多个年份,理想情况下,我希望平均每年的值,以获得单个值 平均每周

我目前拥有Spark数据框上的数据,其格式如下:

Timestamp    Number
.........    ......
M-D-Y        3
M-D-Y        4900
时间戳数据绝不统一或一致(即,我可能有一个值出现在2015年3月1日,表中的下一个值是2015年9月1日……此外,我可能有多个条目)

所以我想做两件事

  • 计算每周的条目数。因此,我需要一个新表,它表示时间戳列在该行对应的周中的行数。如果存在多个年份,理想情况下,我希望平均每年的值,以获得单个值
  • 平均每周的数字列。因此,对于一年中的每一周,我都会有一个表示数字列平均值的值(如果该周内没有条目,则为0)
    通过结合
    unix\u timestamp
    和简单类型转换,使用内置函数可以相对轻松地解析日期:

    sqlContext.sql(
    “选择CAST(UNIX_时间戳('2015年3月1日,'MMM d,yyyy')作为时间戳)”
    ).show(假)
    // +---------------------+
    //|uC0|
    // +---------------------+
    // |2015-03-01 00:00:00.0|
    // +---------------------+
    
    对于
    DataFrame
    DSL,等效代码如下:

    import org.apache.spark.sql.functions.unix\u时间戳
    unix_时间戳($“日期”,“MMM d,yyyy”).cast(“时间戳”)
    
    要填充缺少的条目,可以使用不同的技巧。最简单的方法是使用与上面相同的解析逻辑。首先,让我们创建几个助手:

    def leap(年份:Int)={
    ((第%4年==0)和&(第%100年!=0))| |(第%400年==0)
    }
    def weeksForYear(year:Int)=(1到52).map(w=>s“$year$w”)
    def daysForYear(year:Int)=(1到{if(leap(2000))366 else 366})(
    d=>s“$year$d”
    )
    
    和示例参考数据(此处为数周,但您可以在数天内执行相同的操作):

    import org.apache.spark.sql.functions.{year,weekofyear}
    val exprs=Seq(年($“日期”)。别名(“年”)、周($“日期”)。别名(“周”))
    val weeks2015=Seq(2015年)
    .flatMap(一年一周)
    .map(Tuple1.apply)
    .toDF(“日期”)
    .withColumn(“日期”,unix_时间戳($“日期”,“yyyy w”).cast(“时间戳”)
    .选择(表达式:*)
    
    最后,您可以转换原始数据:

    val df=Seq(
    (“2015年3月1日”,3),(“2015年9月1日”,4900)).toDF(“时间戳”,“编号”)
    val dfParsed=df
    .withColumn(“日期”,unix_时间戳($“时间戳”,“MMM d,yyyy”).cast(“时间戳”))
    .选择(表达式:+$“数字”:
    
    合并和聚合:

    weeks2015.join(dfParsed,Seq(“年”、“周”),“左”)
    .groupBy($“年”,“周”)
    .agg(计数($“数字”)、平均($“数字”))
    .na.填充(0)
    
    听起来很合理。你试过什么了?据我记忆所及,这个问题已经有了不同的变体。@zero323我目前正在尝试使用GroupBy分区执行各种命令。我创建了新的列,指定周数等,并获得平均值。但是,我尝试过的变体目前尚未编译,所以我正在进行编译。因此,您需要两件事:1)能够选择相应的周或日(由内置日期函数覆盖)2)左连接密集数据(基本算术+内置日期函数)@zero323我正在研究日期函数。不过,你介意详细说明一下左边的连接吗?我不太熟悉在那里做什么。