Apache spark 将sql函数重写为纯spark

Apache spark 将sql函数重写为纯spark,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一些我正在尝试优化的代码,我想尝试将sql代码重写为PureSpark 现在我有了这个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(distinc

我有一些我正在尝试优化的代码,我想尝试将sql代码重写为PureSpark 现在我有了这个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)")
有没有一篇文章或怎样写才能帮我重写?
谢谢大家!

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

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

有关DataFrame上的不同可用功能,请参阅:

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

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

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

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

有关DataFrame上的不同可用功能,请参阅:

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

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

您可以使用以下语法来使用

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

现在,您可以在表1的名称上编写SQL,您可以使用以下语法使用

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

现在您可以在表1的名称上编写SQL了

谢谢!我不知道没有区别。我想我会坚持使用SQL,我比pure spark更了解:)碰巧你知道我是否会创建df。createOrReplaceTempView(“名称”)会这样做。作为df.cache()工作。或者我需要以不同的方式使用现金吗?df.createOrReplaceTempView(“name”)--将创建一个本地临时视图,或者将其替换为dataframe df中的“name”。它使您能够在DataFrame上编写SQL查询(如果不创建视图,您将无法直接在DataFrame上编写SQL查询,但是您可以编写DataFrame函数)。是的,我理解这一点,但如何将其缓存在实例内存中?调用df.cache()将DataFrame转换为SQL temp view不是必需的,但是,如果要多次查询数据帧(即在函数中多次引用数据帧),则缓存将产生更好的性能。希望这一点得到澄清,我们可以缓存多个存储级别的数据帧,建议您查看文档谢谢!我不知道没有区别。我想我会坚持使用SQL,我比pure spark更了解:)碰巧你知道我是否会创建df。createOrReplaceTempView(“名称”)会这样做。作为df.cache()工作。或者我需要以不同的方式使用现金吗?df.createOrReplaceTempView(“name”)--将创建一个本地临时视图,或者将其替换为dataframe df中的“name”。它使您能够在DataFrame上编写SQL查询(如果不创建视图,您将无法直接在DataFrame上编写SQL查询,但是您可以编写DataFrame函数)。是的,我理解这一点,但如何将其缓存在实例内存中?调用df.cache()将DataFrame转换为SQL temp view不是必需的,但是,如果要多次查询数据帧(即在函数中多次引用数据帧),则缓存将产生更好的性能。希望这一点得到澄清,我们可以缓存多个存储级别的数据帧,建议您查看文档