目的

DataFrame可以点出来很多方法,都是DF内置的。

比如说:df.withColumn(),df.printSchema()。

但是如果你想打印df中的分区位置信息,以及每个key有多少记录。怎么才能点出来这个方法呢?

实现工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package utils

import org.apache.spark.rdd.RDD
import org.apache.spark.sql._ import scala.language.implicitConversions object {
/**
* DF的装饰类(隐式转换)
*/
class RichDataFrame(dataFrame: DataFrame){
/**
* 用来统计相同key的记录数,常用于调整数据倾斜
*/
def printKeyNums(column: Column): Unit ={
val map = dataFrame.select(column).rdd.countByValue()
println(s"一共${map.size}个key")
for ((key, num) <- map) {
println(key + "共有" + num + "条记录")
}
}
def printKeyNums(column: String): Unit ={
printKeyNums(dataFrame.col(column))
}
/**
* 打印分区位置信息
*/
def printLocation(): Unit ={
println("分区位置信息如下==============")
dataFrame.rdd.mapPartitionsWithIndex(printLocationFunc).collect().foreach(println(_))
}
} /**
大专栏  如何使用隐式转换扩展DataFrame和RDD以及其他的对象> * 扩展df的方法,隐式转换
*/
implicit def df2RichDF(src: DataFrame): RichDataFrame = new RichDataFrame(src) /**
* RDD的装饰类(隐式转换),不加泛型读取不到
*/
class RichRDD(rdd:RDD[_ <: Any]){
def printLocation(): Unit ={
println("分区位置信息如下==============")
rdd.mapPartitionsWithIndex(printLocationFunc).collect().foreach(println(_))
}
} /**
* 扩展RDD的方法,隐式转换
*/
implicit def rdd2RichRDD(src: RDD[_ <: Any]): RichRDD = new RichRDD(src) /**
* 打印rdd的分区信息,需要用mapPartitionsWithIndex方法。
* 使用方法:df.rdd.mapPartitionsWithIndex(printLocationFunc).collect().foreach(println(_))
*/
def printLocationFunc(index: Int, iter: Iterator[Any]): Iterator[String] = {
iter.map(x => "分区" + index + ":" + x + "")
}
}

测试工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import utils.BaseUtil._

object DataFrameDemo extends App {
val sc = ConnectUtil.sc
val spark = ConnectUtil.spark
import spark.implicits._
val df = spark.createDataset(Seq(("aaa", 1, 2), ("bbb", 3, 4), ("bbb", 1, 5), ("bbb", 2, 1), ("ccc", 4, 5), ("bbb", 4, 6))).toDF("key1", "key2", "key3") //测试
df.printKeyNums("key1")
df.printKeyNums($"key1")
df.printLocation()
df.rdd.printLocation()
}

如何使用隐式转换扩展DataFrame和RDD以及其他的对象的更多相关文章

  1. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  2. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  3. 【校招面试 之 C/C++】第18题 C++ 中的隐式转换以及explicit关键字

    1.什么是隐式转换: 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了 ...

  4. 12、scala隐式转换与隐式参数

    一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...

  5. VB.Net隐式转换和显式转换的方法(转)

    VB.Net隐式转换和显式转换的方法(转) “隐式转换”不需要源代码中的任何特殊语法.在下面的示例中,在将 k 的值赋给 q 之前,Visual Basic 将该值隐式转换成单精度浮点值.   Dim ...

  6. Scala 隐式转换及应用

    什么是隐式转换 我们经常引入第三方库,但当我们想要扩展新功能的时候通常是很不方便的,因为我们不能直接修改其代码.scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题. Scala中的隐式转换 ...

  7. Scala模式匹配| 隐式转换

    1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...

  8. Scala之隐式转换

    概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...

  9. 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...

随机推荐

  1. Eclipse打包Jar单独使用

    今天做了一个刷***的功能,代码很简单,只有几十行代码,我开始是在eclipse里面跑的,后面觉得在里面跑不舒服,我就想把他单独作为一个jar文件单独运行,里面使用了第三方jar包,下面记录一下步骤. ...

  2. 填平新版本Xcode安装插件不成功的坑

    一般情况下,安装xcode不成功现象基本上都出现在更新xcode或者重装之后出现的情况,下面原理性德东西,我就不赘述了,度娘上很容易看到,通过这段只是希望大家花费尽量少得时间将xcode插件安装成功. ...

  3. POJ-2349 Arctic Network(最小生成树+减免路径)

    http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to connec ...

  4. F - kebab HDU - 2883 (最大流构图)

    Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled on a long thin stic ...

  5. Qt QString 和 LPCWSTR 的相互转换

    在windosw 编程中,常用到LPCWSTR 变量,QT中最常用到QString,下面提供QString和LPCWSTR 相互转换的方法 LPWSTR 转换成QString LPCWSTR str; ...

  6. TPO5-1 Minerals and plants

    Only recently have investigators considered using these plants to clean up soil and waste sites that ...

  7. 关于前端JS的总结

    简介 JavaScript是一种计算机编程语言,可以像等其他编程语言那样定义变量,执行循环等.主要执行在浏览器上,为HTML页面提供动态效果,而且JavaScript是一种脚本语言,它的代码是解释执行 ...

  8. redhat下libreoffice 的安装

    1.第一次安装libreoffic时是用网络yum源安装的,但是装好之后不能用,找了好久没有找出问题,后来从官网下载安装包后安装就可以了. 下载地址:https://zh-cn.libreoffice ...

  9. Exynos4412开发板-网络-同一网段

    1.1 同一网段在不少实验中,都会需要用到局域网的一些基础知识,在技术支持的过程中,发现不少用户对于这个概念非常模糊,导致 IP 地址或者网络环境稍微有点变化,就无法实现实验.如果没有接触过这个概念, ...

  10. 05 - Tomcat 线程池的配置与优化

    添加 Executor 在server.xml中的Service节点里面,增加executor节点,然后配置connector的executor属性,如下: <Executor name=&qu ...