絮叨两句:
博主是一名数据分析实习生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们
人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战
少年易老学难成,一寸光阴不可轻。
最喜欢的一句话:今日事,今日毕
支付方式标签开发
inType=HBase##zkHosts=192.168.10.20##zkPort=2181##hbaseTable=tbl_orders##family=detail##selectFields=memberId,paymentCode
package cn.itcast.userprofile.up24.statistics
import cn.itcast.userprofile.up24.public.PublicStaticCode
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{
DataFrame, SparkSession}
object PaymentCode extends PublicStaticCode{
override def SetAppName: String = "paymentCode"
override def Four_Name: String = "支付方式"
override def compilerAdapterFactory(spark: SparkSession, five: DataFrame, tblUser: DataFrame): DataFrame = {
five.show()
/**
* +------+--------+
* |tagsId| rule|
* +------+--------+
* | 30| alipay|
* | 31| wxpay|
* | 32|chinapay|
* | 33| kjtpay|
* | 34| cod|
* | 35| other|
* +------+--------+
*/
tblUser.show()
/**
* +---------+-----------+
* | memberId|paymentCode|
* +---------+-----------+
* | 13823431| alipay|
* | 4035167| alipay|
* | 4035291| alipay|
* | 4035041| alipay|
* | 13823285| kjtpay|
*/
/**
* 思路:
* 一个用户可能有多个支付方式,找到每个用户用的最多的次数,就是用户最常用的支付方式
*
*/
import org.apache.spark.sql.functions._
import spark.implicits._
var payCount= count("paymentCode").as("payCount")
val paymentCount = tblUser.groupBy("memberId", "paymentCode").agg(payCount)
/**
* +---------+---------------+--------+
* | memberId| paymentCode|payCount|
* +---------+---------------+--------+
* | 13823481| alipay| 96|
* | 13823481| cod| 14|
* | 4035251| cod| 18|
* | 4035251| chinapay| 4|
* | 4035251| giftCard| 2|
*/
// paymentCount.withColumn("number",row_number().over(window = Window.partitionBy("memberId").orderBy("payCount"))).show()
/**
* 可以看出, payCount次数多的在最下面,如何将此处倒序排列呢
* +---------+-----------+--------+------+
* | memberId|paymentCode|payCount|number|
* +---------+-----------+--------+------+
* | 13822725| prepaid| 1| 1|
* | 13822725| giftCard| 2| 2|
* | 13822725| wspay| 3| 3|
* | 13822725| kjtpay| 9| 4|
* | 13822725| cod| 12| 5|
* | 13822725| alipay| 89| 6|
* | 13823083| giftCard| 1| 1|
* | 13823083| wspay| 7| 2|
* | 13823083| kjtpay| 12| 3|
* | 13823083| cod| 18| 4|
* | 13823083| alipay| 94| 5|
* |138230919| chinapay| 1| 1|
* |138230919| chinaecpay| 1| 2|
* |138230919| wspay| 3| 3|
* |138230919| kjtpay| 7| 4|
* |138230919| cod| 15| 5|
* |138230919| alipay| 98| 6|
* | 13823681| chinapay| 2| 1|
* | 13823681| wspay| 3| 2|
* | 13823681| kjtpay| 5| 3|
* +---------+-----------+--------+------+
*/
/**
* 使用窗口函数,对支付方式进行分区,在排序,取出number为1的数据
*/
val result = paymentCount.withColumn("number", row_number().over(window = Window.partitionBy("memberId").orderBy('payCount.desc))).where("number=1")
/**
* +---------+-----------+--------+------+
* | memberId|paymentCode|payCount|number|
* +---------+-----------+--------+------+
* | 13822725| alipay| 89| 1|
* | 13822725| cod| 12| 2|
* | 13822725| kjtpay| 9| 3|
* | 13822725| wspay| 3| 4|
* | 13822725| giftCard| 2| 5|
* | 13822725| prepaid| 1| 6|
* | 13823083| alipay| 94| 1|
* | 13823083| cod| 18| 2|
* | 13823083| kjtpay| 12| 3|
* | 13823083| wspay| 7| 4|
* | 13823083| giftCard| 1| 5|
* |138230919| alipay| 98| 1|
* |138230919| cod| 15| 2|
* |138230919| kjtpay| 7| 3|
* |138230919| wspay| 3| 4|
* |138230919| chinapay| 1| 5|
* |138230919| chinaecpay| 1| 6|
* | 13823681| alipay| 87| 1|
* | 13823681| cod| 11| 2|
* | 13823681| kjtpay| 5| 3|
* +---------+-----------+--------+------+
*/
result.show()
/**
* +---------+-----------+--------+------+
* | memberId|paymentCode|payCount|number|
* +---------+-----------+--------+------+
* | 13822725| alipay| 89| 1|
* | 13823083| alipay| 94| 1|
* |138230919| alipay| 98| 1|
* | 13823681| alipay| 87| 1|
* | 4033473| alipay| 113| 1|
* | 13822841| alipay| 86| 1|
* | 13823153| alipay| 102| 1|
* | 13823431| alipay| 99| 1|
* | 4033348| alipay| 112| 1|
* | 4033483| alipay| 84| 1|
* | 4033575| alipay| 101| 1|
* | 4034191| alipay| 87| 1|
* | 4034923| alipay| 84| 1|
* | 13823077| alipay| 104| 1|
* |138230937| alipay| 80| 1|
* | 4034761| alipay| 110| 1|
* | 4035131| alipay| 86| 1|
* | 13822847| alipay| 74| 1|
* |138230911| alipay| 101| 1|
* | 4034221| alipay| 86| 1|
* +---------+-----------+--------+------+
*/
val new_Tag = result.join(five, five.col("rule") === result.col("paymentCode"))
.select('memberId.as("userId"), 'tagsId)
/**
* +---------+-----------+--------+------+------+------+
* | memberId|paymentCode|payCount|number|tagsId| rule|
* +---------+-----------+--------+------+------+------+
* | 13822691| cod| 2| 1| 34| cod|
* | 13822725| alipay| 89| 1| 30|alipay|
* | 13823083| alipay| 94| 1| 30|alipay|
* |138230919| alipay| 98| 1| 30|alipay|
* | 13823681| alipay| 87| 1| 30|alipay|
* | 4033473| alipay| 113| 1| 30|alipay|
* | 13822841| alipay| 86| 1| 30|alipay|
* | 13823153| alipay| 102| 1| 30|alipay|
* | 13823431| alipay| 99| 1| 30|alipay|
* | 4033348| alipay| 112| 1| 30|alipay|
* | 4033483| alipay| 84| 1| 30|alipay|
* | 4033575| alipay| 101| 1| 30|alipay|
* | 4034191| alipay| 87| 1| 30|alipay|
* | 4034923| alipay| 84| 1| 30|alipay|
* | 13823077| alipay| 104| 1| 30|alipay|
*/
new_Tag
}
def main(args: Array[String]): Unit = {
startMain()
}
}
以上就是统计型:支付方式标签开发的流程
若有什么正确的地方还请及时反馈,博主及时更正
如能帮助到你,希望能点个赞支持一下谢谢!