Спарк.Как начать понимать приведенный ниже план выполнения - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь понять физический план ниже. Но у меня есть несколько запросов

== Physical Plan ==
*(13) Project [brochure_click_uuid#32, brochure_id#88L, page#36L, duration#188L]
+- *(13) BroadcastHashJoin [brochure_click_uuid#32], [brochure_click_uuid#87], Inner, BuildRight
:- *(13) HashAggregate(keys=[brochure_click_uuid#32, page#36L], functions=[sum(duration#142L)])
:  +- Exchange hashpartitioning(brochure_click_uuid#32, page#36L, 200)
:     +- *(11) HashAggregate(keys=[brochure_click_uuid#32, page#36L], functions=[partial_sum(duration#142L)])
:        +- Union
:           :- *(5) Project [brochure_click_uuid#32, page#36L, CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END AS duration#142L]
:           :  +- *(5) Filter ((isnotnull(event#34) && NOT (event#34 = EXIT_VIEW)) && isnotnull(CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END))
:           :     +- Window [lead(date_time#48, 1, null) windowspecdefinition(brochure_click_uuid#32, date_time#48 ASC NULLS FIRST, specifiedwindowframe(RowFrame, 1, 1)) AS _we0#143], [brochure_click_uuid#32], [date_time#48 ASC NULLS FIRST]
:           :        +- *(4) Sort [brochure_click_uuid#32 ASC NULLS FIRST, date_time#48 ASC NULLS FIRST], false, 0
:           :           +- Exchange hashpartitioning(brochure_click_uuid#32, 200)
:           :              +- Union
:           :                 :- *(1) Project [brochure_click_uuid#32, cast(date_time#33 as timestamp) AS date_time#48, page#36L, event#34]
:           :                 :  +- *(1) Filter isnotnull(brochure_click_uuid#32)
:           :                 :     +- *(1) FileScan json [brochure_click_uuid#32,date_time#33,event#34,page#36L] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/e..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint>
:           :                 :- *(2) Project [brochure_click_uuid#6, cast(date_time#7 as timestamp) AS date_time#20, page#10L, event#8]
:           :                 :  +- *(2) Filter isnotnull(brochure_click_uuid#6)
:           :                 :     +- *(2) FileScan json [brochure_click_uuid#6,date_time#7,event#8,page#10L] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/p..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint>
:           :                 +- *(3) Project [brochure_click_uuid#60, cast(date_time#61 as timestamp) AS date_time#74, page#64L, event#62]
:           :                    +- *(3) Filter isnotnull(brochure_click_uuid#60)
:           :                       +- *(3) FileScan json [brochure_click_uuid#60,date_time#61,event#62,page#64L] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/e..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint>
:           +- *(10) Project [brochure_click_uuid#32, (page#36L + 1) AS page#166L, CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END AS duration#142L]
:              +- *(10) Filter ((((isnotnull(event#34) && isnotnull(page_view_mode#37)) && NOT (event#34 = EXIT_VIEW)) && (page_view_mode#37 = DOUBLE_PAGE_MODE)) && isnotnull(CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END))
:                 +- Window [lead(date_time#48, 1, null) windowspecdefinition(brochure_click_uuid#32, date_time#48 ASC NULLS FIRST, specifiedwindowframe(RowFrame, 1, 1)) AS _we0#143], [brochure_click_uuid#32], [date_time#48 ASC NULLS FIRST]
:                    +- *(9) Sort [brochure_click_uuid#32 ASC NULLS FIRST, date_time#48 ASC NULLS FIRST], false, 0
:                       +- Exchange hashpartitioning(brochure_click_uuid#32, 200)
:                          +- Union
:                             :- *(6) Project [brochure_click_uuid#32, cast(date_time#33 as timestamp) AS date_time#48, page#36L, page_view_mode#37, event#34]
:                             :  +- *(6) Filter isnotnull(brochure_click_uuid#32)
:                             :     +- *(6) FileScan json [brochure_click_uuid#32,date_time#33,event#34,page#36L,page_view_mode#37] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/e..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint,page_view_mode:string>
:                             :- *(7) Project [brochure_click_uuid#6, cast(date_time#7 as timestamp) AS date_time#20, page#10L, page_view_mode#11, event#8]
:                             :  +- *(7) Filter isnotnull(brochure_click_uuid#6)
:                             :     +- *(7) FileScan json [brochure_click_uuid#6,date_time#7,event#8,page#10L,page_view_mode#11] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/p..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint,page_view_mode:string>
:                             +- *(8) Project [brochure_click_uuid#60, cast(date_time#61 as timestamp) AS date_time#74, page#64L, page_view_mode#65, event#62]
:                                +- *(8) Filter isnotnull(brochure_click_uuid#60)
:                                   +- *(8) FileScan json [brochure_click_uuid#60,date_time#61,event#62,page#64L,page_view_mode#65] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/e..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,date_time:string,event:string,page:bigint,page_view_mode:string>
+- BroadcastExchange HashedRelationBroadcastMode(List(input[1, string, true]))
+- *(12) Project [brochure_id#88L, brochure_click_uuid#87]
+- *(12) Filter isnotnull(brochure_click_uuid#87)
+- *(12) FileScan json [brochure_click_uuid#87,brochure_id#88L] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/D:/Interview Preparation/Bonial Interview Related/exercise-S/exercise-S/b..., PartitionFilters: [], PushedFilters: [IsNotNull(brochure_click_uuid)], ReadSchema: struct<brochure_click_uuid:string,brochure_id:bigint>

У меня есть следующие вопросы

  1. Что такое голова и какой хвост, т.е. с чего начатьи проходите дальше.
  2. Какая голова и какой хвост, т. е. с чего начать и пройти дальше
  3. каковы эти числа в начале каждой строки, например (13), (11), (5).
  4. некоторые строки имеют + - в начале, а некоторые имеют: -.В чем разница и когда + - печатается и когда: - печатается перед строкой
  5. Элемент списка
  6. что означает значение каскадных строк, например, как показано ниже.

.

:        +- Union
:           :- *(5) Project [brochure_click_uuid#32, page#36L, CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END AS duration#142L]
:           :  +- *(5) Filter ((isnotnull(event#34) && NOT (event#34 = EXIT_VIEW)) && isnotnull(CASE WHEN (event#34 = EXIT_VIEW) THEN null ELSE (unix_timestamp(_we0#143, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta)) - unix_timestamp(date_time#48, yyyy-MM-dd'T'HH:mm:ss, Some(Asia/Calcutta))) END))
:           :     +- Window [lead(date_time#48, 1, null) windowspecdefinition(brochure_click_uuid#32, date_time#48 ASC NULLS FIRST, specifiedwindowframe(RowFrame, 1, 1)) AS _we0#143], [brochure_click_uuid#32], [date_time#48 ASC NULLS FIRST]
:           :        +- *(4) Sort [brochure_click_uuid#32 ASC NULLS FIRST, date_time#48 ASC NULLS FIRST], false, 0
:           :           +- Exchange hashpartitioning(brochure_click_uuid#32, 200)
Есть вертикальная линия, образованная с помощью: соединения двух линий. Какой смысл в этих линиях?Как эти два шага связаны друг с другом

1 Ответ

1 голос
/ 23 сентября 2019

Позвольте мне попытаться ответить на ваши вопросы один за другим:

Какая голова, а какой хвост, т. Е. С чего начать и пройти дальше.

План запроса имеетструктура дерева, поэтому вы должны спросить, что является корнем и что такое лист.Конечные узлы - это самые вложенные узлы, в вашем случае это FileScan json, и их больше.Таким образом, вы начинаете читать с них, и вы должны добраться до корня, который находится в верхней части плана, в вашем случае это первый оператор Project.

Что это за числа в началекаждой строки, например (13), (11), (5)

Это codegenStageId.На этапе физического планирования Spark генерирует Java-код для операторов в плане.Позвольте мне процитировать непосредственно исходный код Spark:

codegenStageCounter создает идентификатор для этапов кодирования в плане запроса.Этот идентификатор используется для разграничения этапов кодирования.Он включен как часть вывода объяснения для физических планов.Идентификатор делает очевидным, что не все смежные операторы плана codegen имеют один и тот же этап codegen.

Также звездочка * означает, что Spark сгенерировал код.

некоторые строки имеют + - в начале, а некоторые имеют: -.В чем разница и когда + - печатаются и когда: - печатаются перед строкой

Некоторые операторы имеют больше дочерних элементов, например Union, BroadcastHashJoin или SortMergeJoin (и есть другие).В этом случае дочерние элементы такого оператора отображаются в плане следующим образом:

Union
:- Project ...
:  +- here can be child of project
:
+- Project ...
   +- here can be child of project 

Таким образом, этот план означает, что оба проекта являются дочерними по отношению к оператору Союза, и поэтому они находятся на одном уровне вдерево.

Что означает каскадные линии

Эти каскады

+- Project
   +- Filter
      +- Window

просто означают, что этот Filter является потомком ProjectWindow является дочерним элементом Filter и так далее.Это дерево, и оно остановится на узле листа, который не имеет дочерних элементов.В вашем плане лист: FileScan json

Есть вертикальная линия, образованная с помощью: соединения двух линий. Какой смысл в этих линиях.Как эти два шага связаны друг с другом

Как я объяснил выше, вертикальные линии, образованные с: предназначены для соединения операторов на одном уровне в дереве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...