[英]Is df.schema action or transformation?
我有一个手动创建的模式,用于创建 dataframe 说myschema
现在我的 dataframe 说df
已创建。
现在,我对df
做了一些操作,一些列被删除了。
说原始myschema
由 500 列组成
现在删除一些列后,我的df
包含 450 列。
现在在我的代码中的某个地方我需要返回模式,但只有 dataframe 之后的模式应用了一些操作(即有 450 列)。
现在,
Q1。 调用df.schema
并使用它有多优化,是行动还是转换?
Q2。 我应该通过从myschema
中过滤掉那些将被删除并使用的列来创建另一个myschema2
吗?
快速回答:
到 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 是对分布式数据集的抽象,正如您已经指出的那样,它们定义了转换和操作。 当您对数据帧进行一些转换时,幕后发生的事情是 spark 只是构建了一个描述该转换的有向无环图。 当该 DAG 被分析并用于构建执行计划以完成工作时
另一方面,动作触发计划的执行,即转换实际数据。
转换后的数据框的模式源自初始数据框的模式,基本上沿着 DAG行走。 这种派生的影响是_neglectable,它不依赖于数据的大小,它取决于DAG有多大,但在所有实际情况下,您可以忽略获取模式所需的时间。 Schema 只是附加到 dataframe 的元数据。
所以回答 Q2:不,你不应该让 schema2 跟踪你的修改。 只需调用 df.schema Spark 就会为您做到这一点
希望这可以消除您的疑虑
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.