2017-01-03 4 views
1

나는 스파크를 마루와 함께 사용합니다. 필자는 가장 자주 사용하는 열을 캐시에 저장하고 다른 하나는 디스크에 보관할 수 있기를 원합니다.DataFrame의 부분 수직 캐싱

myDataFrame.select("field1").cache 
myDataFrame.select("field1").count 
myDataFrame.select("field1").where($"field1">5).count 
myDataFrame.select("field1", "field2").where($"field1">5).count 

네 번째 라인은 캐시를 사용하지 않습니다 내가 좋아하는 뭔가를 실행 해요.

여기에 도움이되는 간단한 해결책이 있습니까?

답변

0

캐시되지 않는 이유는 데이터 프레임에서 변환 (예 : 선택)을 수행 할 때마다 실제로 새로운 데이터 프레임을 생성하기 때문입니다. 기본적으로 한 것은 field1 만 포함하는 데이터 프레임과 5보다 큰 field1 만 포함하는 데이터 프레임을 캐시하는 것입니다 (여기서는 field2를 의미했을지 모르지만 상관 없습니다).

네 번째 줄에는 원본 데이터 프레임에 대한 계보가없는 세 번째 데이터 프레임을 만듭니다.

당신이 일반적으로 강력한 필터링을 할 경우 (즉, 당신이 요소의 매우 작은 번호를) 당신은 이런 식으로 뭔가를 할 수 있습니다

cachedDF = myDataFrame.select("field1", "field2", ... "fieldn").cache 
cachedDF.count() 
filteredDF = cachedDF.filter(some strong filter) 
res = myDataFrame.join(broadcast(filteredDF), cond) 

즉 cachedDF은 필터링 모든 필드, 당신은 매우 강력 필터가 그런 다음 모든 관련 데이터를 제공하는 내부 조인 (cond를 모든 관련 선택된 필드 또는 일부 id 필드로 함)을 수행합니다.

말하자면 대부분의 경우 마루와 같은 파일 형식을 사용한다고 가정하면 캐싱이 도움이되지 않습니다.

+0

감사합니다. 실제로 여기에 쓴 것은 (field1) 파르 케는 원주 형식이기 때문에 캐시되지 않은 필드에 대해서만 디스크에 액세스 할 수있는 캐시를 얻으려고합니다. 여기에서는 조인이 가능한 해결책이지만 대부분의 경우 조인이 매우 비쌉니다. – roee