代码之家  ›  专栏  ›  技术社区  ›  user3243499

在函数中定义spark转换并在bigdata中返回新的数据帧是否安全?

  •  -1
  • user3243499  · 技术社区  · 6 年前

    我有一个数据框架 df1 . 我计划把它分成两个数据帧- df2 df3 . 现有的代码流具有几乎相同的转换序列。所以我想在一个函数中定义所有这些转换集,这个函数接受一个数据帧并执行这些转换,并返回转换后的数据帧。

    因此,使用这种方法(尤其是使用bigdata)或简单地对两个数据帧重复相同的序列转换两次是否安全? DF2 DF3 (这会增加代码)?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Arnon Rotem-Gal-Oz    6 年前

    没问题,也不会影响你的表现。Spark不会直接运行代码。它根据您定义的转换生成一个计划。如果您在函数中执行这些操作或复制代码,它们将是相同的。

        2
  •  1
  •   BlueSheepToken    6 年前

    如果我理解的很好,可以定义一个将多个方法分组的方法,您可能希望对 andThen 如果需要应用许多方法,则使用清除代码的方法

    https://www.scala-lang.org/api/current/scala/Function1.html

        3
  •  0
  •   Nonontb    6 年前

    你可以使用 .transform() 方法。

    它存在于具有以下签名的数据帧API中:

    def transform[U](t: (DataFrame) ⇒ DataFrame): DataFrame`
    

    在数据集API中(数据帧是数据集[row]的别名,从2.2.0开始:

    def transform[U](t: (Dataset[T]) ⇒ Dataset[U]): Dataset[U]
    

    因此,您可以定义一个方法:

    def mytransformation(inputDF:DataFrame):DataFrame = { 
      //transformationgo there 
      // val ouputDF = inputDF.map(...).filter(...) 
      outputDF 
    }
    

    或函数:

    val mytransformation:DataFrame => DataFrame = inputDF => {  
      // val ouputDF = inputDF.map(...).filter(...)
      outputDF 
    }
    

    然后可以将myTransformation作为参数传递给transform方法