scala - df.schema 是动作还是转换?
问题描述
我有一个手动创建的模式来创建数据框,比如说myschema
现在我的数据框df
已经创建。
现在,我做了一些操作df
,一些列被删除了。
说原始myschema
包含 500 列
现在删除一些列之后,我df
的包含 450 列。
现在在我的代码中的某个地方,我需要返回模式,但只有在数据框应用了一些操作之后的模式(即有 450 列)。
现在,
Q1。调用df.schema
和使用它的优化程度如何,是行动还是转变?
Q2。我应该myschema2
通过过滤掉那些myschema
将被删除的列来创建另一个并使用它吗?
解决方案
快速回答:
到 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 只是附加到数据框的元数据。
所以回答 Q2:不,你不应该让 schema2 跟踪你的修改。只需调用 df.schema Spark 就会为您做到这一点
希望这可以消除您的疑虑
推荐阅读
- mongodb - 一个自动缩放的mongodb副本集
- jquery - jquery hide 和 css display none 不起作用
- ruby - 是什么意思?
- javascript - 如何在javascript中处理输入参数
- java - 某些网站图像未显示在 android 的 webview 中
- regex - 去掉最外面的括号
- java - JPA:'CascadeType.REMOVE' 或 'orphanRemoval = true',在 an:n 关系中使用,生成带有 EmbeddeId 类的新表/类?
- javascript - Froala VUE v3 不显示工具栏按钮
- returnn - RETURNN Librispeech 任务:为 LM 和编码器-解码器模型重用预训练模型的参数
- java - 如何使用大值格式化程序设置自定义后缀