需求
计算每个商品分类的成交量
假设有如下csv数据
A0001 202.106.196.115 手机 iphone8 8000
A0002 202.106.196.116 服装 Tshirt 450
A0003 202.106.196.117 药品 阿莫西林 40
A0004 202.106.196.118 药品 板蓝根 23
A0005 202.106.196.119 手机 iphone9 8000
A0006 202.106.196.120 服装 Tshirt 320
A0007 202.106.196.121 药品 阿莫西林 40
A0008 202.106.196.122 药品 板蓝根 23
A0009 202.106.196.123 手机 iphone10 8000
A0010 202.106.196.124 服装 Tshirt 450
A0011 202.106.196.125 药品 阿莫西林 40
A0012 202.106.196.126 药品 板蓝根 23
A0013 202.106.196.127 手机 iphone11 8000
A0014 202.106.196.128 服装 Tshirt 450
A0015 202.106.196.129 药品 阿莫西林 40
A0016 202.106.196.130 药品 板蓝根 23
A0017 202.106.196.131 手机 iphone12 9999
A0018 202.106.196.132 服装 Tshirt 340
csv读取成DataSet[Sale]
就是将读取的csv的转成DataSet[Sale]对象
//csv转dataset对象
//计算每个商品分类的成交量
object HomeWork2 extends App {
private val spark: SparkSession = SparkSession.builder().master("local[2]").appName("test")
.getOrCreate()
private val schema: StructType = (new StructType)
.add("id", DataTypes.StringType)
.add("ip", DataTypes.StringType)
.add("kind", DataTypes.StringType)
.add("detail", DataTypes.StringType)
.add("price", DataTypes.StringType)
private val df: DataFrame = spark.read.schema(schema).csv("D://tmp/test.csv")
import spark.implicits._
private val ds: Dataset[Sale] = df.as[Sale]
ds.createTempView("tmp")
val sql=
"""
|select kind,sum(price) sum
|from tmp
|group by kind
|""".stripMargin
private val df1: DataFrame = spark.sql(sql)
df1.show()
}
case class Sale(id: String, ip: String, kind: String, detail: String, price: String) {
}
运行结果
+----+-------+
| 服装| 2010.0|
| 药品| 252.0|
| 手机|41999.0|
+----+-------+
csv读取成DataFrame 或者说DataSet[Row]
利用DF完成需求
//csv转dataset对象
object HomeWork3 extends App {
private val spark: SparkSession = SparkSession.builder().master("local[2]").appName("test")
.getOrCreate()
private val schema: StructType = (new StructType)
.add("id", DataTypes.StringType)
.add("ip", DataTypes.StringType)
.add("kind", DataTypes.StringType)
.add("detail", DataTypes.StringType)
.add("price", DataTypes.StringType)
private val df: DataFrame = spark.read.schema(schema).csv("D://tmp/test.csv")
.toDF("id","ip","kind","detail","price")
df.createTempView("tmp")
val sql=
"""
|select kind,sum(price)
|from tmp
|group by kind
|""".stripMargin
private val df1: DataFrame = spark.sql(sql)
df1.show()
}
总结
- DataSet可以将每一行映射成一个自定义对象,DataFrame不可以