在数据框上使用聚合操作比使用spark.sql()直接实现SQL聚合有好处吗?

时间:2019-05-05 15:09:15

标签: apache-spark pyspark

过去6个月以上,我一直在工作。我已经看到来自数据仓库和SQL背景的人们正在使用

在SQL中实现聚合和其他转换逻辑
static t_file *sort_files(t_file *head) {
    t_file *file;
    t_file *next;

    file = head;
    while ((next = file->next) != NULL) {
        if (strcmp(file->name, next->name) > 0) {
            swap_files(file, next);    // swap the nodes linkage
            file = next;               // next is now before file
            if (file->previous) {
                file = file->previous; // backtrack to the previous node
            } else {
                head = file;           // save the new head of list
            }
        } else {
            file = file->next;
        }
    }
    return head;
}

直接在配置单元表上,或在使用

将数据框注册为TempView之后
spark.sql() 
(where spark is the sparkSession object) 

但是,如果我们看到了其他选项,例如Windows函数或可直接在数据帧上实现的替代项,或者甚至可以将函数注册为UDF并可以在数据帧上实现。

说如果我需要在CITY_CENSUS数据框上按城市实施人口分组计数,则可以通过以下两种方法之一实现

使用spark.sql():

dataframe.createOrReplaceTempView(). 

直接在数据框上使用聚合:

CITY_CENSUS.createOrReplaceTempView("CITY_CENSUS")
spark.sql("select city,count(population) from CITY_CENSUS group by city")

像这样,我们有很多例子。

使用数据框方法比spark.sql()有任何性能优势,反之亦然。

1 个答案:

答案 0 :(得分:0)

数据帧DSL当前不会处理所有子查询。使用Spark SQL,您将能够更好地解决这种情况。当然,AGGRegations也可能需要这些...

UDF不能被Catalyst所优化,并且可能导致物理计划的执行效率降低。