如何将SparkSQL查询输出同时用于HIVE,同时用于另一个SparkSQL查询

时间:2018-06-21 22:15:46

标签: apache-spark apache-spark-sql pyspark-sql

是否有可能将SparkSQL数据帧o / p插入到Hive表中,并同时将相同的数据帧用作子查询来进行另一个SaprkSQL操作。下面的伪代码应该给出我要实现的目标的想法-

from pyspark import SparkConf, SparkContext
from pyspark.sql import HiveContext
conf = SparkConf().setAppName("test_app")
sc = SparkContext(conf=conf)

hive_context = HiveContext(sc)
query1 = "select col1, col2, sum(col3) from input_table_1 group by col1, col2"
query2 = "select col1, sum(col1) from temp_table col1"
qry1_df = hive_context.sql(query1)
qry1_df.write.format("parquet").insertInto("output_table_1", overwrite=True)
qry1_df.registerTempTable("temp_table")
qry2_df = hive_context.sql(query2)
qry2_df.write.format("parquet").insertInto("output_table_2", overwrite=True)

我希望执行query2以利用qry1_df的输出,而不必重新计算整个DAG(上面的代码就是这种情况)。

更新: 根据使用缓存的建议,下面是修改后的代码

from pyspark import SparkConf, SparkContext
from pyspark.sql import HiveContext
conf = SparkConf().setAppName("test_app")
sc = SparkContext(conf=conf)

hive_context = HiveContext(sc)
query1 = "select col1, col2, sum(col3) from input_table_1 group by col1, col2"
query2 = "select col1, sum(col1) from temp_table col1"
hive_context.sql("CACHE TABLE temp_table as " + query1)
qry1_df = hive_context.sql("Select * from temp_table")
qry1_df.write.format("parquet").insertInto("output_table_1", overwrite=True)    
qry2_df = hive_context.sql(query2)
qry2_df.write.format("parquet").insertInto("output_table_2", overwrite=True)

有效。只是一个澄清-这两个任务,分别写入Hive表“ output_table_1”和执行“ query2”,是异步还是顺序进行?

1 个答案:

答案 0 :(得分:1)

尝试在tempview上使用.cacheTable()

spark.cacheTable("my_table")