Быстрые ответы:
в 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 сделает это за вас
надеюсь, это прояснит ваши сомнения