【问题标题】:rewrite sql function to pure spark将sql函数重写为纯spark
【发布时间】:2018-09-25 17:22:10
【问题描述】:

我有我正在尝试优化的代码,作为我想尝试将 sql 代码重写为纯 Spark 的一种方式 现在我有了这个 sql:

val df_result_week_agg = sparkSession.sqlContext.sql("SELECT group_id, client_id ,m_id ,min(date) stats_date ,sum(trans_cnt) trans_cnt,sum(revenue) revenue,count(DISTINCT id) cust_total, count(distinct returning_hash_id) loyal_cust_total ,'W' time_period  FROM customers  GROUP BY group_id, client_id , me_id, year(date),date_sub(to_date(date),date_format(to_date(date), 'u')-1)")

是否有一些文章或如何帮助我重写它? 谢谢 !

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    编写 SQL 查询或编写 DataFrame 代码之间没有性能差异,它们都“编译”到我们在 DataFrame 代码中指定的相同底层计划。

    两种方法都使用完全相同的执行引擎和内部数据结构。归根结底,一切都归结为个人喜好。

    DataFrame上不同的可用函数参考:http://spark.apache.org/docs/2.2.1/api/python/pyspark.sql.html#pyspark.sql.DataFrame

    在上述查询中,由于您只是分组和聚合,您可以使用 groupBy DataFrame 函数:

    df.groupBy('group_id', 'client_id', 'me_id').agg({'date': 'min', 'trans_cnt': 'sum'})
    

    【讨论】:

    • 谢谢!我不知道没有区别。我想我不会坚持使用 SQL,我比纯 spark 更了解 :)
    • 碰巧你知道我是否会创建 df.createOrReplaceTempView("name") 会。作为 df.cache() 工作。还是我需要以不同的方式处理现金?
    • df.createOrReplaceTempView("name") -- 将使用来自数据框 df 的“名称”创建或替换本地临时视图。它使您可以在 DataFrame 上编写 SQL 查询(不创建视图,您将无法直接在 DataFrame 上编写 SQL 查询,但是您可以编写 DataFrame 函数)。
    • 是的,我明白这一点,但是如何将它缓存在实例内存中?
    • 调用 df.cache() 不是强制将数据帧转换为 sql 临时视图,但如果您多次查询数据帧(即在函数中多次引用数据帧),那么缓存将产生更好的性能.希望这一点清楚,我们可以缓存数据帧的多个存储级别,建议您查看文档
    【解决方案2】:

    可以使用下面的语法来使用

    dbDf0.createOrReplaceTempView("name_for_Table_1");
    dbDf0.cache();
    dbDf0.count();
    

    现在您可以在 name_for_Table_1 之上编写 SQL

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2014-09-19
      • 2019-03-15
      • 2019-01-06
      • 1970-01-01
      • 2022-12-19
      相关资源
      最近更新 更多