Является ли df.schema действием или преобразованием? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть схема, созданная вручную для создания фрейма данных, скажем, myschema
Теперь мой фрейм данных, скажем, df создан.

Теперь я сделал несколько операций над df, и некоторые из столбцов были удалены.
скажем, оригинал myschema состоит из 500 столбцов
Теперь после удаления некоторых столбцов мой df состоит из 450 столбцов.

Теперь где-то в моем коде мне нужна схема назад, но только схема после того, как в dataframe были применены некоторые операции (ie. с 450 столбцами).


Теперь,
Q1. Насколько оптимально вызывать df.schema и использовать его, это действие или трансформация?
Q2. Должен ли я создать еще один myschema2, отфильтровав те столбцы из myschema, которые будут отброшены, и использовать это?

1 Ответ

2 голосов
/ 01 мая 2020

Быстрые ответы:

в Q1: схема не является ни действием, ни преобразованием, в том смысле, что она не изменяет фрейм данных и не не вызывать никаких вычислений.

до Q2: если я хорошо понимаю, я думаю, у вас есть что-то вроде

val myschema = StructType(someSchema)
val df = spark.createDataFrame(someData, myschema)

// do some transformation (drop, add columns etc)
val df2 = df.drop("column1", "column2").withColumn("new", $"c1" + $"c2"))

, и вы хотите получить схему df2. если это так, вы можете просто использовать

val myschema2 = df2.schema

Длинный ответ: Неформально говоря, DataFrame - это абстракция над распределенными наборами данных, и, как вы уже отметили, существуют преобразования и действия определенные на них. Когда вы производите некоторое преобразование для фреймов данных, то, что происходит под капотом, это то, что искра просто строит Directed Acycli c Graph , описывающий эти преобразования. Когда этот DAG анализируется и используется для построения плана выполнения для выполнения работы

Действия с другой стороны запускают выполнение плана, который преобразует фактические данные.

Схема преобразованного фрейма данных выводится из схемы исходного фрейма данных, в основном проходя вдоль DAG. Влияние таких дериваций является _neglectable, это не зависит от размера данных, это зависит от того, сколько большой DAG, но во всех практических случаях, вы можете игнорировать время, необходимое для получения схемы. Схема - это просто метаданные, прикрепленные к фрейму данных.

Итак, чтобы ответить на вопрос 2: Нет, вы не должны иметь схему 2, отслеживающую изменения, которые вы сделали. Просто позвонив в df.schema, Spark сделает это за вас

надеюсь, это прояснит ваши сомнения

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