【问题标题】:Append/Union multiple dataframes in Scala在 Scala 中追加/联合多个数据帧
【发布时间】:2021-11-21 01:35:22
【问题描述】:

我来自 python 背景,试图将一个函数转换为 scala。

在这个虚拟示例中,我需要将多个(未知数量)数据帧合并在一起。

%python

list_of_dfs = [
    spark.createDataFrame(
         [('A', 'C'),    
          ('B', 'E')
         ], ['dummy1','dummy2']),
    spark.createDataFrame(
             [('F', 'G'),    
              ('H', 'I')
             ], ['dummy1','dummy2'])]

for i, df in enumerate(list_of_dfs):
    if i == 0:
        union_df = df
    else:
        union_df = union_df.unionAll(df)
        
union_df.display()

按我想要的方式工作。 “union_df = union_df.unionAll(df)”是我在 scala 中重现时遇到的问题。

    %scala
    ... outer loop creates each iterations dataframe
    if(i==0) {
      val union_df=df 
    } else{
      val union_df=union_df.union(df)
    }  

我得到这个“错误:递归值 union_df 需要类型”。我无法将文档翻译成我的解决方案,因为类型是数据框。显然我需要真正学习一些关于 scala 的知识,但这是我现在想要跨越的桥梁。感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    您不需要手动管理循环来遍历 Scala 中的集合。由于您试图从多个值变为一个值,我们可以使用 reduce 方法:

      val dfs: Iterable[DataFrame] = ???
      val union_df = dfs.reduce(_ union _)
    

    【讨论】:

      【解决方案2】:

      在 Scala 代码中,您有 val union_df=union_df.union(df) -> 您正在定义一个值并尝试调用它。

      应该是这样的:

      if(i==0) {
         val union_df=df 
      } else{
         union_df = union_df.union(df)
      }
      

      上一个答案更好,改用reduce或foldLeft(foldRight)函数。

      【讨论】:

        【解决方案3】:

        我会接受 Jarrod Baker 的回答,因为我确信它更合适。

        但最终对我有用的是将其实例化为一个空数据框,然后执行附加操作。

        %scala
        ... outer loop creates each iterations dataframe
        var union_df = spark.emptyDataFrame
        if(i==0) {
          union_df=df
        } else{
          union_df=union_df.union(df)
        } 
        

        【讨论】:

          猜你喜欢
          • 2016-07-31
          • 1970-01-01
          • 1970-01-01
          • 2017-09-15
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-03
          相关资源
          最近更新 更多