Hadoop 将大量spark数据帧合并为一个

Hadoop 将大量spark数据帧合并为一个,hadoop,apache-spark,hive,pyspark,hdfs,Hadoop,Apache Spark,Hive,Pyspark,Hdfs,我在for循环中使用满足不同条件的不同查询查询缓存的配置单元临时表,查询次数超过1500次。我需要在循环中使用unionAll来合并它们。但是我得到了stackoverflow错误,因为spark无法跟上RDD沿袭 伪代码: df=[from a hive table] tableA=[from a hive table] tableA.registerTempTable("tableA") HiveContext.sql('CACHE TABLE tableA') for i in rang

我在for循环中使用满足不同条件的不同查询查询缓存的配置单元临时表,查询次数超过1500次。我需要在循环中使用unionAll来合并它们。但是我得到了stackoverflow错误,因为spark无法跟上RDD沿袭

伪代码:

df=[from a hive table]
tableA=[from a hive table]
tableA.registerTempTable("tableA")
HiveContext.sql('CACHE TABLE tableA')

for i in range(0,2000):
    if (list[0]['column1']=='xyz'):
        df1=query something from tableA
        df=df.unionAll(df1)
    elif ():
        df1=query something from tableA
        df=df.unionAll(df1)
    elif ():
        df1=query something from tableA
        df=df.unionAll(df1)
    elif ():
        df1=query something from tableA
        df=df.unionAll(df1)
    else:
        df1=query something from tableA
        df=df.unionAll(df1)
由于RDD沿袭变得困难,这会引发StackOverFlow错误。因此,我尝试按如下方式设置检查点:

for i in range(0,2000):
    if (list[0]['column1']=='xyz'):
        df1=query something from tableA
        df=df.unionAll(df1)
    elif ():
        df1=query something from tableA
        df=df.unionAll(df1)
    else:
        df1=query something from tableA
        df=df.unionAll(df1)
    df.rdd.checkpoint
    df = sqlContext.createDataFrame(df.rdd, df.schema)
我也犯了同样的错误。所以我尝试了SaveAsTable,这是我一直想要避免的,因为在循环中,每个hql查询和配置单元io之间的作业提交都存在延迟。但这种方法效果很好

for i in range(0,2000):
    if (list[0]['column1']=='xyz'):
        df=query something from tableA
        df.write.saveAsTable('output', mode='append')
    elif ():
        df=query something from tableA
        df.write.saveAsTable('output', mode='append') 

我需要帮助避免将数据帧保存到循环内的配置单元中。我想以某种方式合并dfs,这种方式在内存中并且高效。我尝试过的另一个选项是直接将查询结果插入临时表中,我得到一个错误:无法插入到基于RDD的表中。

也许,结果的临时表可以工作

df1="query something from tableA".registerTempTable("result")
sqlContext.sql("Insert into result query something from tableA")

也许,临时表的结果将工作

df1="query something from tableA".registerTempTable("result")
sqlContext.sql("Insert into result query something from tableA")

一般来说,这种循环和联合操作总是会导致Spark出现问题。您正在运行什么类型的查询?也许有一种更聪明的方法来重构代码,它不需要循环。还有,条件是什么?条件并不复杂——一些正则表达式匹配和一些直接整数匹配。但问题是,我让最终用户能够创建这些条件,他们只能编写基于sql的条件,并将它们导入spark来处理数据。简单地说,我的应用程序就像一个sql工作台,不同之处在于它运行所有查询并将结果存储在一个表中。通常,这种循环和联合操作总是会导致Spark出现问题。您正在运行什么类型的查询?也许有一种更聪明的方法来重构代码,它不需要循环。还有,条件是什么?条件并不复杂——一些正则表达式匹配和一些直接整数匹配。但问题是,我让最终用户能够创建这些条件,他们只能编写基于sql的条件,并将它们导入spark来处理数据。简单地说,我的应用程序就像一个sql工作台,不同之处在于它运行所有查询并将结果存储在一个表中。正如我在文章中提到的,它抛出一个错误:无法插入基于RDD的表。正如我在文章中提到的,它抛出一个错误:无法插入基于RDD的表。