scala - 如果我继续在其中添加列,是否应该保留一个Spark数据框?

标签 scala apache-spark dataframe apache-spark-sql persist

我在互联网上搜索过的任何论坛中都找不到关于以下主题的讨论。可能是因为我是Spark和Scala的新手,而不是在问有效的问题。如果有任何讨论相同或相似主题的主题,这些链接将非常有帮助。 :)

我正在研究一个使用Spark和Scala的过程,它通过读取大量表并通过对从表中获取的数据应用逻辑来创建一个文件来创建文件。因此,我的代码结构如下:

val driver_sql = "SELECT ...";

var df_res = spark.sql(driver_sql)

var df_res = df_res.withColumn("Col1", <logic>)

var df_res = df_res.withColumn("Col2", <logic>)

var df_res = df_res.withColumn("Col3", <logic>)
.
.
.

var df_res = df_res.withColumn("Col20", <logic>)

基本上,有一个驱动程序查询可创建“驱动程序”数据帧。之后,基于驱动程序数据框中的一个或多个键执行单独的逻辑(功能),以添加新的列/字段。 “逻辑”部分并不总是一行代码,有时,它是一个单独的函数,它运行另一个查询并在df_res上进行某种联接并添加一个新列。 在某些情况下,由于我将“内部”联接与其他表/数据框一起使用,因此记录计数也发生了变化。

所以,这是我的问题:
  • 我是否应在任何时间坚持df_res
  • 添加列后,我可以一次又一次地保留df_res吗?我的意思是,它会增加值(value)吗?
  • 如果每次添加新列时我都坚持使用df_res(仅磁盘),是否替换了磁盘中的数据?还是在磁盘中创建了df_res的新副本/版本?
  • 在这样的情况下是否有更好的技术来持久化/缓存数据(以避免在内存中做很多事情)?
  • 最佳答案

    首先,当您要在数据帧上应用迭代操作时,持久保存数据帧会有所帮助。
    您在这里所做的是在数据帧上应用转换操作。无需在此处保留这些数据框。
    例如:-如果您正在做这样的事情,坚持下去会有所帮助。

    val df = spark.sql("select * from ...").persist
    
    df.count
    
    val df1 = df.select("..").withColumn("xyz",udf(..))
    
    df1.count
    
    val df2 = df.select("..").withColumn("abc",udf2(..))
    
    df2.count
    

    现在,如果您在此处坚持使用df,那么在计算df1和df2时将是有益的。
    这里还要注意的另一件事是,我执行df.count的原因是因为仅在对数据帧应用操作时才保留数据帧。从Spark文档:
    “第一次在操作中对其进行计算,它将被保存在节点上的内存中”。这也回答了您的第二个问题。

    每次您坚持使用时,都会创建一个新副本,但是您应该首先取消保留上一个副本。

    关于scala - 如果我继续在其中添加列,是否应该保留一个Spark数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430540/

    相关文章:

    scala - Sbt 多模块构建 - 维护模块 dep 图作为模块中的 libraryDependencies

    java - 如何在 IntelliJ 中控制 Spark 日志记录

    apache-spark - Spark : Merge 2 dataframes by adding row index/number on both dataframes

    python - 从数据框中的索引获取最小值

    python - Pandas 对一列进行分组而不丢失其他列?

    python - 通过 "OTHER"python 重命名不太频繁的类别

    scala - Scala 中 == 和 .equals 有什么区别?

    scala - scala 在处理文件时是否提供异步非阻塞 IO?

    scala - 如何从 Windows 工作站向我的私有(private) Artifactory 服务器提供 SBT 凭据?

    hadoop - Spark数据帧插入到配置单元表失败,因为使用用户名映射器创建的一些暂存零件文件