【问题标题】:How to store dataframe, view in tuple in spark-scala如何存储数据帧,在 spark-scala 中查看元组
【发布时间】:2021-10-14 00:53:37
【问题描述】:

我正在尝试从 MongoDB 并行获取数据并将所有数据帧、视图名称存储在一个集合中,以便我可以引用它们。

为此,我创建了一个集合,我试图在其中存储数据帧和视图。将元素附加到集合时出现错误。我尝试使用 Vector、List、Seq。但似乎没有什么对我有用。

有没有办法处理这些问题?

var mongoFrames = Nil

for(c <- collections) {
    var connectionString = connectionInt.setCollection(c);
    var dframe = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri", connectionString).load()
    var view = dframe.createOrReplaceTempView(c);
    var mongoQuery = s"select * from $c where tuid in (${tuidIn.mkString(",")})";

    var tup = (c, dframe, view, mongoQuery)
    mongoFrames += tup
}

for(v <- mongoFrames) yield spark.sql(v._4).collect() // load data from source into spark

更新

尝试使用 +: 时,出现以下错误

error: value +: is not a member of (String, org.apache.spark.sql.DataFrame,单位,字符串) mongoFrames +: tup

【问题讨论】:

  • this 能满足您的需求吗?
  • scala 集合是不可变的,因此每次添加或添加到它们时都需要重新分配给变量。运算符为:++:
  • @James 我不明白该链接到底想显示什么。我正在尝试解决此mongoFrames += tup 的问题
  • 如果我每次都必须使用新的变量名,我将如何迭代多个集合。循环遍历集合似乎是我唯一的解决方案。但它不工作。
  • 我在答案中添加了关于迭代部分的更多解释。但是,如果您需要在此迭代后创建一个新集合,您可以使用 map 而不是 foreach

标签: scala apache-spark scala-collections


【解决方案1】:

你可以写成:

var mongoFrames: Seq[Tuple3[String, DataFrame,String]] = Seq.empty

var tup: Tuple[String, DataFrame, String] = (c, dframe, mongoQuery)

mongoFrames = mongoFrames :+ tup

然后

遍历它

for(v <- mongoFrames) yield spark.sql(v._3).collect() 

编辑 1:

在这种情况下,一种更惯用的迭代集合的方法是这样写:

mongoFrames.foreach(spark.sql(_._3).collect())

使用匿名函数。

以下简称:

mongoFrames.foreach(mongoFrame => spark.sql(mongoFrame._3).collect())

【讨论】:

    【解决方案2】:

    这应该适合你:

    var mongoFrames = List.empty[(String, DataFrame, Unit, String)]
    
    for(c <- collections) {
    //...
    mongoFrames = mongoFrames:+ tup
    }
    

    不要将createOrReplaceTempView的变量添加到元组中,因为方法返回Unit是没有用的。您可以在 SparkSession 中使用其名称访问该临时视图。

    【讨论】:

    • 你的回答也是正确的。然而,@James 正在与我聊天,他帮助我调试了多个错误问题。所以标记他的答案是正确的。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2019-01-26
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多