再论DataSet与DataFrame的区别

本文介绍如何使用Spark对商品交易数据进行分类统计,通过两种方式实现:一种是将CSV文件转换为DataSet自定义对象并进行统计;另一种是直接使用DataFrame进行操作。

需求

计算每个商品分类的成交量

假设有如下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不可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭梨山大哎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值