하위 그룹 내에서 해당 열의 첫 번째 값을 가져올 수 있습니까?Dataframe은 해당 열의 첫 번째 및 마지막 값을 가져옵니다.
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.{Window, WindowSpec}
object tmp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val input = Seq(
(1235, 1, 1101, 0),
(1235, 2, 1102, 0),
(1235, 3, 1103, 1),
(1235, 4, 1104, 1),
(1235, 5, 1105, 0),
(1235, 6, 1106, 0),
(1235, 7, 1107, 1),
(1235, 8, 1108, 1),
(1235, 9, 1109, 1),
(1235, 10, 1110, 0),
(1235, 11, 1111, 0)
).toDF("SERVICE_ID", "COUNTER", "EVENT_ID", "FLAG")
lazy val window: WindowSpec = Window.partitionBy("SERVICE_ID").orderBy("COUNTER")
val firsts = input.withColumn("first_value", first("EVENT_ID", ignoreNulls = true).over(window.rangeBetween(Long.MinValue, Long.MaxValue)))
firsts.orderBy("SERVICE_ID", "COUNTER").show()
}
}
출력 싶습니다.
먼저 (또는 이전) FLAG에 기초하여 열 EVENT_ID 값 = FLAG에 기초하여 열 EVENT_ID 1 그리고 마지막 (또는 다음) 값 = SERVICE_ID 1 개 파티션 카운터 정렬+----------+-------+--------+----+-----------+-----------+
|SERVICE_ID|COUNTER|EVENT_ID|FLAG|first_value|last_value|
+----------+-------+--------+----+-----------+-----------+
| 1235| 1| 1101| 0| 0| 1103|
| 1235| 2| 1102| 0| 0| 1103|
| 1235| 3| 1103| 1| 0| 1106|
| 1235| 4| 1104| 0| 1103| 1106|
| 1235| 5| 1105| 0| 1103| 1106|
| 1235| 6| 1106| 1| 0| 1108|
| 1235| 7| 1107| 0| 1106| 1108|
| 1235| 8| 1108| 1| 0| 1109|
| 1235| 9| 1109| 1| 0| 1110|
| 1235| 10| 1110| 1| 0| 0|
| 1235| 11| 1111| 0| 1110| 0|
| 1235| 12| 1112| 0| 1110| 0|
+----------+-------+--------+----+-----------+-----------+
유용. 6 백만 행의 클러스터에서이를 실행하지 않습니다. 하지만 그 전에는 플래그 (편집 내 원래 게시물)에 대한 마지막 (또는 다음) 값에 대한 또 다른 열을 추가해야합니다. – xstack2000
@ xstack2000 이미 답변을 얻은 후에 너무 많이 추가하지 않으려하면 일부 답변이 무용지물이되어 미래의 방문자를 혼란스럽게 할 수 있습니다. 그러나 원하는 열을 추가했으며, 나중에 창의 행을 보는'lead' 함수를 사용합니다. – Shaido
Shaido 귀하의 답변은 매우 도움이됩니다. 내 원래 게시물에 더 추가했지만 귀하의 회신에 감사드립니다. 다른 누군가가 볼 수 있다면 추가 한 연속적인 레코드에 2 개의 플래그가 있는지 처리하는 방법은 여전히 필요합니다. 하지만 답장으로 답장을드립니다. 감사. – xstack2000