복붙노트

[SCALA] 스파크 스칼라 : 시간 또는 분에 의해 두 열의 참조 DateDiff

SCALA

스파크 스칼라 : 시간 또는 분에 의해 두 열의 참조 DateDiff

나는 대안의 시간 차이의 분 차이를 받거나 싶습니다하는 dataframe에 두 개의 타임 스탬프 열이. 현재 내가 수행하여, 둥근을 사용해, 하루 차이를 얻을 수 있어요

val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2")))

그러나, 나는 문서 페이지에서 보았을 때 https://issues.apache.org/jira/browse/SPARK-8185 나는 장치를 변경할 수있는 추가 매개 변수를 참조하지 않았다. 자신의 다른 기능은 나는이에 사용해야됩니까?

해결법

  1. ==============================

    1.당신은 초 차이로를 얻을 수 있습니다

    당신은 초 차이로를 얻을 수 있습니다

    import org.apache.spark.sql.functions._
    val diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")
    

    그럼 당신은 당신이 원하는 유닛을 얻기 위해 약간의 수학을 할 수 있습니다. 예를 들면 :

    val df2 = df1
      .withColumn( "diff_secs", diff_secs_col )
      .withColumn( "diff_mins", diff_secs_col / 60D )
      .withColumn( "diff_hrs",  diff_secs_col / 3600D )
      .withColumn( "diff_days", diff_secs_col / (24D * 3600D) )
    

    또는 pyspark에서 :

    from pyspark.sql.functions import *
    diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")
    
    df2 = df1 \
      .withColumn( "diff_secs", diff_secs_col ) \
      .withColumn( "diff_mins", diff_secs_col / 60D ) \
      .withColumn( "diff_hrs",  diff_secs_col / 3600D ) \
      .withColumn( "diff_days", diff_secs_col / (24D * 3600D) )
    
  2. ==============================

    2.다니엘 드 폴라에 의해 주어진 대답은 작동하지만, 그 해결책은 차이가 테이블의 모든 행에 대해 필요한 경우 일을하지 않습니다. 다음은 각 행에 대해 그렇게하는 솔루션입니다 :

    다니엘 드 폴라에 의해 주어진 대답은 작동하지만, 그 해결책은 차이가 테이블의 모든 행에 대해 필요한 경우 일을하지 않습니다. 다음은 각 행에 대해 그렇게하는 솔루션입니다 :

    import org.apache.spark.sql.functions
    
    val df2 = df1.selectExpr("(unix_timestamp(ts1) - unix_timestamp(ts2))/3600")
    

    이 첫번째 변환 초 유닉스 타임 스탬프 열의 데이터는, 그것들을 감산하고 시간 차이로 변환한다.

    기능의 유용한 목록에서 찾을 수 있습니다 : http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions$

  3. from https://stackoverflow.com/questions/37058016/spark-scala-datediff-of-two-columns-by-hour-or-minute by cc-by-sa and MIT license