执行多个火花查询并存储为数据框

Posted

技术标签:

【中文标题】执行多个火花查询并存储为数据框【英文标题】:Executing multiple spark queries and storing as dataframe 【发布时间】:2018-03-11 06:55:09 【问题描述】:

我在 List - sqlQueries 中保存了 3 个 Spark 查询。其中前两个创建全局临时视图,第三个在这些临时视图上执行并获取一些输出。 我可以使用它运行单个查询 -

val resultDF = spark.sql(sql)

然后我在这个数据框对象上添加分区信息并保存它。 如果有多个查询,我尝试执行

sqlQueries.foreach(query => spark.sql(query))

如何保存第三个查询的输出以保持其他 2 个查询运行。 例如,我有 3 个查询,它可以是任何数字。

【问题讨论】:

没有***.com/a/49213255/5880706 帮助你吗? 这有助于获取查询。我该如何保存?基本上,如果我保存最终输出,我如何确保查询在此之前运行。 【参考方案1】:

您可以将最后一个查询编写为插入语句以将结果保存到表中。您正在通过 foreach 执行查询,这些查询将按顺序执行。

【讨论】:

【参考方案2】:

我从您的other question 中引用了需要修改的查询,如 sql 部分中的global-temporary-view 中所述。

修改后你的查询文件应该是这样的

CREATE GLOBAL TEMPORARY VIEW VIEW_1 AS select a,b from abc
CREATE GLOBAL TEMPORARY VIEW VIEW_2 AS select a,b from global_temp.VIEW_1
select * from global_temp.VIEW_2

然后回答这个问题:您可以再次使用foldLeft 来反映多个查询。

假设你有一个dataframe

+----+---+---+
|a   |b  |c  |
+----+---+---+
|a   |b  |1  |
|adfs|df |2  |
+----+---+---+

并且给定上面的多行查询文件,你可以做如下操作

df.createOrReplaceTempView("abc")
val sqlFile = "path to test.sql"
val queryList = scala.io.Source.fromFile(sqlFile).getLines().filterNot(_.isEmpty).toList

val finalresult = queryList.foldLeft(df)((tempdf, query) => sqlContext.sql(query))
finalresult.show(false)

这应该给你

+----+---+
|a   |b  |
+----+---+
|a   |b  |
|adfs|df |
+----+---+

【讨论】:

以上是关于执行多个火花查询并存储为数据框的主要内容,如果未能解决你的问题,请参考以下文章

存储火花数据框-pyspark

加入多个数据框火花

将多个火花数据框列转换为具有列表类型的单列

蜂巢分区表上的火花行为

遍历火花数据框中的列并计算最小值最大值

火花数据框密封特征类型