将大量火花数据帧合并为一个

时间:2017-04-07 03:55:29

标签: hadoop apache-spark hive pyspark hdfs

我在for循环中使用满足不同条件超过1500次的不同查询来查询缓存的hive临时表。我需要在循环内使用unionAll将它们合并。但是由于火花无法跟上RDD血统,我得到了stackoverflow错误。

伪代码:

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查询和hive 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') 

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

1 个答案:

答案 0 :(得分:0)

也许,结果的临时表将起作用。

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