조건자 푸시다운:
조인과 위치 조건이 모두 있는 쿼리를 사용할 때마다 조인이 먼저 전체 데이터에서 발생하고 여기서 조건에 따라 필터링이 발생합니다. 매우 큰 데이터 집합의 경우 조인은 필터링되지 않은 데이터 집합에서 발생하기 때문에 데이터 집합을 조인하는 데 몇 시간의 계산이 필요합니다.
술어 푸시 다운,이름 자체는 자명하다,술어는 일반적으로 참 또는 거짓을 반환 할 경우 조건이다. 맵 단계에서 스파크가 수행하는 작업은 조건자 조건을 데이터베이스로 직접 푸시하고 조건자 조건을 사용하여 데이터베이스 수준에서 데이터를 필터링하여 데이터베이스에서 검색된 데이터를 줄이고 쿼리 성능을 향상시키는 것입니다. 필터링이 데이터 저장소 자체에서 발생하기 때문에 쿼리는 매우 빠르며 필터링이 이미 발생했기 때문에 필터링되지 않은 데이터를 네트워크를 통해 전송하는 것을 방지하고 이제 필터링 된 데이터 만 메모리에 저장됩니다.
설명 방법을 사용하여 술어 푸시 다운이 사용되는지 여부에 관계없이 데이터 프레임의 실제 계획을 볼 수 있습니다. 술어가 작동하지 않으면 술어가 해당 데이터 형식으로 캐스팅되어야합니다.
>>> df = spark.read.parquet("file1").filter((F.col("date") >= "2019-08-01") & (F.col("date") <= "2019-09-01"))>>> df.explain()
== Physical Plan ==
*(1) Project
+- *(1) Filter ((isnotnull(date#237) && (cast(date#237 as string) >= 2019-08-01)) && (cast(date#237 as string) <= 2019-09-01))
+- *(1) FileScan parquet Batched: true, Format: Parquet, Location: InMemoryFileIndex, PushedFilters: , ReadSchema: struct<id:string,date:date,day_of_week:int,hour_of_day:int,impressions:bigint,a..
위의 예제에서는 시간 프레임을 기반으로 데이터 집합을 필터링하려고 하는데,푸시된 필터는 데이터 집합에 대해 수행해야 하는 모든 조건자를 표시합니다.
>>> df = spark.read.parquet("file1").filter((F.col("date") >= datetime.strptime("2019-08-01", "%Y-%m-%d").date()) & (F.col("date") <= datetime.strptime("2019-09-01", "%Y-%m-%d").date()))>>> df.explain()
== Physical Plan ==
*(1) Project
+- *(1) Filter ((isnotnull(date#273) && (date#273 >= 18109)) && (date#273 <= 18140))
+- *(1) FileScan parquet Batched: true, Format: Parquet, Location: InMemoryFileIndex, PushedFilters: , ReadSchema: struct<frame_id:string,id:string,date:date,day_of_week:int,hour_of_day:int,impressions:bigint,a...
위의 예에서,날짜가 제대로 날짜 시간 형식으로 주조 입력,이제 설명에서 당신은 술어가 아래로 밀어 볼 수 있습니다.