2017-12-12 1 views
0

RDD로 작업 한 여러 프로젝트가 끝나면 데이터 세트를 사용하기 시작했습니다. 자바 개발에 사용하고 있습니다.데이터 세트에서 열을 호출하는 데 걸리는 비용은 무엇입니까

필자가 아는 한 열은 변경 불가능합니다. 열에 대한지도 기능은 없으며 열을 매핑하는 표준 방법은 withColumn 열을 추가하는 것입니다.

내 질문은 withColumn을 호출 할 때 실제로 발생합니다. 성과 위약금이 있습니까? 가능한 한 적은 withColumn 전화를 걸려고합니까, 아니면 중요하지 않습니까?

피기 백 질문 : 분해 또는 피벗과 같은 다른 행/열 작성 함수를 호출 할 때 성능이 저하됩니까?

+0

withColumn의 경우 거의 없습니다. 메타 데이터의 변화입니다. 피벗은 데이터 집합을 그룹화 한 후에 만 ​​사용할 수 있으므로 값 비쌉니다. – philantrovert

+0

폭발은 Spark 2.2 이전의 Spark 2에서 매우 느릴 수 있습니다. https://issues.apache.org/jira/browse/SPARK-21657 –

답변

1

DataFrame과 상호 작용하는 다양한 기능의 성능이 모두 빠르면 문제가 없을 정도로 빠릅니다 (실제로 알 수 있습니다).

드라이버에서 정의한 트랜스 액션을 스파크가 어떻게 실행하는지 이해하면 더 이해가됩니다. 다양한 변환 함수 (withColumn, 등 선택)를 호출 할 때 Spark는 실제로 아무 것도하지 않습니다. 실행 계획에서 실행할 작업을 등록합니다. 액션을 호출 할 때까지 스파크가 데이터 계산을 시작하지 않으며 일반적으로 결과를 얻거나 데이터를 기록합니다.

실행하려는 모든 작업을 알고 있으면 실제로 실행하기 전에 실행 계획에서 최적화를 수행 할 수 있습니다. 예를 들어, withColumn을 사용하여 새 열을 만든 다음 데이터를 파일에 기록하기 전에 해당 열을 삭제한다고 가정합니다. Spark은 실제로 그 열을 계산할 필요가 없다는 것을 알고 있습니다. 일반적으로 드라이버의 성능을 결정합니다

일들은 다음과 같습니다

  1. 얼마나 많은 다양한 변환 (집행 사이의 데이터의 셔플) 거기 얼마나 많은 데이터를 단행되고
  2. 내가 어떤이 있습니까

      : 고가의 변환은 폭발과 피벗 대한 추가 질문에 대해

을 기능

  • Explode는 새 행을 작성하지만 좁은 변환입니다. 집행자간에 데이터를 이동하지 않고도 파티션을 바꿀 수 있습니다. 이것은 수행하기가 비교적 저렴하다는 것을 의미합니다. 코멘트에 Raphael이 지적한 것처럼 폭발하는 매우 큰 어레이가있는 경우 예외입니다.
  • 피벗은 와이드 변환 인 groupBy 조작이 필요합니다. 주어진 키에 대한 모든 데이터가 동일한 파티션에 있는지 확인하기 위해 모든 실행 프로그램에서 다른 모든 실행 프로그램으로 데이터를 보내야합니다. 이것은 필요한 추가 네트워크 트래픽 때문에 많은 비용이 드는 작업입니다.
  • +0

    "얕은"나는 "좁음"을 의미한다고 생각합니까? 얕은 변형은 들어 본 적이 없다 ..... 폭발은 Spark 2.0/2.1의 대형 배열 (https://issues.apache.org/jira/browse/SPARK-16998 및 https : // issues)의 경우 매우 비효율적이라는 점에 유의하십시오.apache.org/jira/browse/SPARK-21657 –

    +0

    예, 얕은 것은 오타였습니다. 수정되어 폭발 설명을 포함하도록 업데이트되었습니다. 감사! – RyanW

    관련 문제