Long 유형의 열에서 RangeBetween을 사용하여 Spark DataFrame에서 창 함수를 수행하려고하는데이 창의 결과가 올바르지 않습니다. 내가 뭔가 잘못하고 있는거야?Spark Window 함수 범위 잘못된 결과 생성 중
val rowsRdd: RDD[Row] = spark.sparkContext.parallelize(
Seq(
Row("2014-11-01 08:10:10.12345", 141482941L),
Row("2014-11-01 09:10:10.12345", 141483301L),
Row("2014-11-01 10:10:10.12345", 141483661L),
Row("2014-11-02 10:10:10.12345", 141492301L),
Row("2014-11-03 10:10:10.12345", 141500941L),
Row("2014-11-04 10:10:10.12345", 141509581L),
Row("2014-11-05 10:10:10.12345", 141518221L),
Row("2014-11-06 10:10:10.12345", 141526861L),
Row("2014-11-07 10:10:10.12345", 141535501L),
Row("2014-11-08 10:10:10.12345", 141544141L)
)
)
val schema = new StructType()
.add(StructField("dateTime", StringType, true))
.add(StructField("unixTime", LongType, true))
val df = spark.createDataFrame(rowsRdd, schema)
df.show(10, false)
df.printSchema()
입니다 : 여기
내 DataFrame입니다+-------------------------+---------------+
|dateTime |unixTime |
+-------------------------+---------------+
|2014-11-01 08:10:10.12345|141482941|
|2014-11-01 09:10:10.12345|141483301|
|2014-11-01 10:10:10.12345|141483661|
|2014-11-02 10:10:10.12345|141492301|
|2014-11-03 10:10:10.12345|141500941|
|2014-11-04 10:10:10.12345|141509581|
|2014-11-05 10:10:10.12345|141518221|
|2014-11-06 10:10:10.12345|141526861|
|2014-11-07 10:10:10.12345|141535501|
|2014-11-08 10:10:10.12345|141544141|
+-------------------------+---------------+
스키마 :
root
|-- dateTime: string (nullable = true)
|-- unixTime: long (nullable = true)
첫 번째 열은 이벤트 (문자열의 타임 스탬프는, 우리는하지 않습니다 실제로 그것을 사용한다) 그리고 두 번째 열은 10e-5 초 단위의 타임 스탬프에 해당하는 유닉스 시간이다.
이제 현재 행을 진행하는 창에서 여러 이벤트를 계산하려고합니다. 3 시간의 창 예를 들어 내가 할 : 여기
+-------------------------+---------------+---+
|dateTime |unixTime |cts|
+-------------------------+---------------+---+
|2014-11-01 08:10:10.12345|141482941|1 |
|2014-11-01 09:10:10.12345|141483301|2 |
|2014-11-01 10:10:10.12345|141483661|3 |
|2014-11-02 10:10:10.12345|141492301|1 |
|2014-11-03 10:10:10.12345|141500941|1 |
|2014-11-04 10:10:10.12345|141509581|1 |
|2014-11-05 10:10:10.12345|141518221|1 |
|2014-11-06 10:10:10.12345|141526861|1 |
|2014-11-07 10:10:10.12345|141535501|1 |
|2014-11-08 10:10:10.12345|141544141|1 |
+-------------------------+---------------+---+
을 6 시간 창에 대한 결과입니다 제대로 반환
val hour: Long = 60*60*100000L
val w = Window.orderBy(col("unixTime")).rangeBetween(-3*hour, 0)
val df2 = df.withColumn("cts", count(col("dateTime")).over(w)).orderBy(asc("unixTime"))
. 결과가 모두 0 인 이유는 무엇입니까?
val hour: Long = 60*60*100000L
val w = Window.orderBy(col("unixTime")).rangeBetween(-6*hour, 0)
val df2 = df.withColumn("cts", count(col("dateTime")).over(w)).orderBy(asc("unixTime"))
+-------------------------+---------------+---+
|dateTime |unixTime |cts|
+-------------------------+---------------+---+
|2014-11-01 08:10:10.12345|141482941|0 |
|2014-11-01 09:10:10.12345|141483301|0 |
|2014-11-01 10:10:10.12345|141483661|0 |
|2014-11-02 10:10:10.12345|141492301|0 |
|2014-11-03 10:10:10.12345|141500941|0 |
|2014-11-04 10:10:10.12345|141509581|0 |
|2014-11-05 10:10:10.12345|141518221|0 |
|2014-11-06 10:10:10.12345|141526861|0 |
|2014-11-07 10:10:10.12345|141535501|0 |
|2014-11-08 10:10:10.12345|141544141|0 |
+-------------------------+---------------+---+
12 시간 동안 발생합니다. 결과가 모두 1 인 이유는 무엇입니까?
val hour: Long = 60*60*100000L
val w = Window.orderBy(col("unixTime")).rangeBetween(-12*hour, 0)
val df2 = df.withColumn("cts", count(col("dateTime")).over(w)).orderBy(asc("unixTime"))
+-------------------------+---------------+---+
|dateTime |unixTime |cts|
+-------------------------+---------------+---+
|2014-11-01 08:10:10.12345|141482941|1 |
|2014-11-01 09:10:10.12345|141483301|1 |
|2014-11-01 10:10:10.12345|141483661|1 |
|2014-11-02 10:10:10.12345|141492301|1 |
|2014-11-03 10:10:10.12345|141500941|1 |
|2014-11-04 10:10:10.12345|141509581|1 |
|2014-11-05 10:10:10.12345|141518221|1 |
|2014-11-06 10:10:10.12345|141526861|1 |
|2014-11-07 10:10:10.12345|141535501|1 |
|2014-11-08 10:10:10.12345|141544141|1 |
+-------------------------+---------------+---+
여기 무슨 일이 일어나고 있습니까? 큰 rangeBetween 값에서는 올바르게 작동하지 않습니다.
편집 :이 문 제에 관한 뭔가 2017년 9월 11일
인가? [SPARK-19451][SQL] rangeBetween method should accept Long value as boundary #18540. Spark의 최신 버전에서 이미 구현 되었습니까?