Spark join / groupby数据集需要花费很多时间

时间:2018-02-09 13:53:32

标签: java scala hadoop apache-spark apache-spark-sql

我有2个 35kk + 行的数据集(表格)。

我尝试通过某个ID 加入(或分组)此数据集。 (共同点是一对一)

但是此操作需要很长时间: 25+ h

过滤器只能正常工作: ~20分钟

环境:emr-5.3.1

Hadoop发布:亚马逊

应用程序:Ganglia 3.7.2,Spark 2.1.0,Zeppelin 0.6.2

实例类型: m3.xlarge

代码( groupBy ):

Dataset<Row> dataset = ...
...
.groupBy("id")
.agg(functions.min("date"))
.withColumnRenamed("min(date)", "minDate")

代码(加入):

...
.join(dataset2, dataset.col("id").equalTo(dataset2.col("id")))

我也在EMR日志中找到了这条消息:

HashAggregateExec: spark.sql.codegen.aggregate.map.twolevel.enable is set to true, but current version of codegened fast hashmap does not support this aggregate.

1 个答案:

答案 0 :(得分:1)

数据可能会被歪斜。我们面对这个。检查您的加入列。如果您的加入列具有NULLS

,则会发生这种情况

使用以下方法检查数据存储模式:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


class MyLabel(tk.Label):
    def __init__(self, master, var="", *args, **kwargs):
        tk.Label.__init__(self, master, *args, **kwargs)
        self.var = var


    def __setattr__(self, name, value):
        self.__dict__[name] = value
        if name == 'var':
            self.do_stuff()


    def do_stuff(self):
        self['text'] = self.var


if __name__ == '__main__':
    root = tk.Tk()
    demo = MyLabel(root, "Value")
    demo.pack()
    demo.var = "New Value"
    tk.mainloop()

这将让您了解加入列中的数据是否均匀分布