统计踩坑日记:
1.同一个包,同一个类下面的方法可以直接调用,实例:
def stat (statDate : String):DataSet[Row] ={
val df = newstat(statDate)
df
}
def newstat(stat:String):DataSet[Row] ={
df
}
2.scala可以向python一样优美,不需要各种调用,各种嵌套
实例:
val df1 = session.sql(s"......")
df1.createTempView("df1")
val df2 = session.sql(s"select ...... from df1")
df2.createTempView("df2")
val df2 = session.sql(s"select ...... from df2")
以此类推。。。。
3.scala使用SQL传值很简单,但有一点小弯弯绕绕
例如:
val df1 = session.sql("select * from tempView where dt = $'dt'")
很遗憾,scala并不支持这样传值哦
正确做法是:
import session.implicits._
val df1 = session.sql(s"select * from tempView where dt = '${dt}'")
隐式转换和's' 和'{}'是必须的。
4.聚合函数禁止“套娃”
val df = df1.agg.sum(expr(sum()))
画个大叉,但支持
val df2 = df1.agg(sum(expr("")) as ...)
val df3 = df2.agg(sum(expr("")) as ...)
5.习惯性persist是一个好习惯,好处自己百度去,我只负责告诉你这很香
6.方法一调用方法二,这俩方法别写太远,否则全文找还找不到就很难受
7.多尝试使用withColumn方法,不用多次建立dataframe
实例:
val df = df1.withColumn("重命名",lit(原字段.function))
8.sparkSQL使用聚合函数和groupBy有点神奇的地方,有个first别忘了加
实例:
val df1 = sql("select distinct first(orgno),first(tgno),first(tgid),first(dt),sum(case when error > 0 then 1 else 0 end) as error_cnt from temp group by tgno,dt")
不写会报这样的错
org.apache.spark.sql.AnalysisException: expression 'temp.`orgno`' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;;
9.有时候找不到哪里错了,不如想想有没有可能是哪里少了个隐形的return
10.细心,做大数据的一跑程序几小时,没那么多次机会给你重来
11.如果有改代码的需求,不用强求和原作者的风格一致,你可以按照自己的风格来,记得写好注释,防止后面人看不懂。