我有一个拼花桌,我们称之为table_a
,大约是6gb。我需要将这个表与50万个其他拼花板表连接起来,比如,table_1
…table_n
,大小在10MB到20GB之间。然后我在其他地方写连接的内容。连接字段是A、B和C,表名(1…n)上的后缀表示表A的值
如果我选择一个表(比如表1),然后将表“a”筛选为“a”==“1”的记录,则运行得非常快(<;1分钟):
table_1 = sqlContext.read.load(path_to_table_1)
table_a = sqlContext.read.load(path_to_table_a).filter("A = '1'")
broadcasted_a = broadcast(table_a)
# omitting "A" here because we've already filtered down for it
result = table_1.join(broadcasted_a, ["B", "C"))
do_something_with_result(result)
但是,当我尝试在不预先过滤表_a的情况下执行联接时,联接挂起。我等了10-20分钟才完成连接,但还没看到它完成。所以,虽然我可以用过滤的方法对1个表起作用,但我不确定如何在所有表1…n中执行此操作。我可以遍历50万个拼花板表,并对每个表执行上述步骤,但我想知道是否有一种更快的方法来表示这些连接并并行地在拼花板表上循环。我的一个想法是将表1…n的路径收集到rdd中,然后尝试:
^{pr2}$但这不起作用,因为您不能在foreach
等函数中嵌套rdd。在
我有什么选择可以快速加入这些表格?有没有其他方法可以在不嵌套RDD的情况下过滤每个表1…n?或者,有没有什么方法可以优化所有表1…n和表\u a之间的单个、大规模连接?在
更新1
我用table_a重新运行了table_1的join(没有预过滤),最后收到了以下警告,之后所有作业都崩溃了:
2017-06-01 14:49:11,879 WARN org.apache.hadoop.hdfs.DFSClient -
Error Recovery for block XXX in pipeline DatanodeInfoWithStorage[XXX,DISK],
DatanodeInfoWithStorage[XXX,DISK],
DatanodeInfoWithStorage[XXX,DISK]: bad datanode DatanodeInfoWithStorage[XXX,DISK]
然后我尝试删除表_a的广播,然后进行连接(同样,没有预过滤)——它工作得非常好。接下来,我将尝试读取parquet表的整个目录,并将生成的数据帧与表\u a DataFrame连接起来-但我愿意接受任何其他更有效的解决方案。在
目前没有回答
相关问题 更多 >
编程相关推荐