繁体   English   中英

df.schema 是动作还是转换?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM