spark - 小实践(2)dataset实战

背景

     spark官方example文件夹中提供了people.json的一份测试数据,并结合官方dataset使用方式的介绍,我们可以做一些练习,准备好的数据可以到这里下载:https://download.csdn.net/download/u013560925/10342251。

     数据json读取时候的dataframe格式如下:

     people.json:对应用户姓名和年龄

     peopleScore.json: 对应用户的姓名和分数


 !!之前使用的2.1的api,现在转为了较新的2.2的api,注意!在此说明spark和sql相关版本信息如下,如果版本不一致,api的使用方式会有所出入:         

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
    <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.2.0</version>
            <scope>compile</scope>
    </dependency>

正文

        本次涉及练习的api方法有:joinwith、groupBy、countDistinct、agg、sample、sort、dropDuplicates、join、mapPartition

       dataset是强类型的数据集合,所以在很多时候都需要as[Int]等操作来生命数据类型,这是dataframe所不需要的。

0. 相关初始化和导入准备

初始化:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .getOrCreate()
       //注意要单独引入以下引用包!!!!
      import  spark.implicits._     //隐式转换
      import org.apache.spark.sql.functions._     //agg内置算法

1. joinWith

2.1 spark版本的条件是可以直接用字符串的,比如($"name"===$"n"),在2.2版本中就必须列来表示。

personsDS.joinWith(personScoresDS,personsDS("name")===personScoresDS("n")).show


2. groupBy+countDistinct

注意as[Int]、as[String],注意使用agg(sum) 需要引入之前所说的依赖
personsDS.groupBy("name").agg(sum("age").as[Int],countDistinct("age").as[Int],current_date().as[String]).show()

3. agg

personsDS.groupBy("name").agg(collect_list("name").as[String],collect_set("age").as[Int])

4. sample

运行三次,每一次的随机抽取的数据都不一样

personsDS.sample(false,0.5).show()

5. sort

  personsDS.sort("age").show()

6. dropDuplicates

 personsDS.dropDuplicates("name").show
    

6. join

personsDS.join(personScoresDS,personsDS("name")===personScoresDS("n")).show


7. mapPartition

def doubleFunc(iter: Iterator[Person]) : Iterator[(String,Long)] = {
      var res = ArrayBuffer[(String,Long)]()
      while (iter.hasNext)
      {
        val cur = iter.next;
        res+=((cur.name,cur.age+1000))
      }
      res.iterator
    }
      personsDS.mapPartitions(doubleFunc)


结论

1.spark core和sql版本很重要,版本不同api使用方式不同

2.使用官方javadoc查看api使用方式,对应版本查询

3.百度得到的方法,很可能因为版本不一样而无法使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值