是否有可能将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”,是异步还是顺序进行?
答案 0 :(得分:1)
尝试在tempview上使用.cacheTable()
spark.cacheTable("my_table")