2017-02-12 3 views
0

안녕하세요 몇 가지 규칙에 따라 레코드 그룹에서 행을 표시하고 싶습니다. 내 출력 dataframe 규칙 두 columns.From ID의 그룹 (a, b), 첫 번째에 기초 주어진 dataframe에서스파크 데이터 프레임의 행 그룹에서 행을 표시하는 방법

id price date 
a 200 2016 
b 100 2016 

이어야

id price date 
a 100 2016 
a 200 2016 
a 100 2016 
b 100 2016 
b 100 2015 

이하 같은 dataframe을 최대 가격과 최근 날짜를 기준으로 한 두 번째 값을 기준으로합니다. 실제 규칙은 더 복잡하며 많은 다른 열도 포함됩니다.

이와 같은 문제를 해결하기위한 최선의 방법은 무엇입니까? 몇 가지 규칙을 기반으로 행 그룹에서 행을 선택해야합니다. 도움이 될 것입니다. 감사합니다

+0

"행 표시"가 무슨 뜻인지 잘 모르겠습니다. 또한 뭔가 다른, 당신은 지금까지 무엇을 시도 했습니까? – eliasah

+0

@eliasah "행 표시"는 행 그룹에서 행을 표시하는 것을 의미합니다. 여기 2 행째 (id a)와 1 행째 (id b)입니다. 이것에 관해 많은 진전을 이루지 못했지만, collect_set을 사용하여 모든 값을 얻고 규칙을 적용하려고했습니다. 감사합니다. – John

답변

2

이것을 시도하십시오.

val df = Seq(("a",100,2016), ("a",200,2016), ("a",100,2016), ("b",100,2016),("b",100,2015)).toDF("id", "price", "date") 
df.show 
val df1 = df.select($"id", struct($"price", $"date").alias("data")).groupBy($"id").agg(max("data").alias("data")).select($"id", $"data.price", $"data.date") 
df1.show 

다음과 같은 출력이 표시됩니다.

+---+-----+----+ 
| id|price|date| 
+---+-----+----+ 
| b| 100|2016| 
| a| 200|2016| 
+---+-----+----+ 
+0

감사합니다. @abaghel . 내 실제 규칙은 최대 agg 함수보다 약간 복잡합니다. 내가 솔루션을 찾고 있는데, 사용자 정의 규칙을 지정할 수 있습니다. 제안 사항이 있으면 알려주십시오. – John

+0

다른 옵션은 df.createOrReplaceTempView ("myTable")를 사용하여 Dataframe을 임시 테이블로 등록한 다음 해당 테이블에서 SQL 쿼리를 사용하는 것입니다. UDF를 사용하여 규칙/논리를 처리 할 수도 있습니다. – abaghel

관련 문제