如何存储数据框,在 spark-scala 中查看元组

How to store dataframe, view in tuple in spark-scala

我正在尝试从 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, Unit, String) mongoFrames +: tup

这应该适合你:

var mongoFrames = List.empty[(String, DataFrame, Unit, String)]

for(c <- collections) {
//...
mongoFrames = mongoFrames:+ tup
}

不要把createOrReplaceTempView的变量添加到元组中,因为方法returns单元没有用。您可以在 SparkSession 中使用它的名称访问该临时视图。

你可以写成:

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())