目的

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. js运算符相关要点

    取模运算的结果符号只与左边值的符号有关: var x = 7 % 3; // 结果为 1 var y = 7 % (-3); // 结果为 1 var z = (-7) % 3; // 结果为 -1

  2. Matlab高级教程_第一篇:Matlab基础知识提炼_01

    第一篇:Matlab基础知识提炼: 这一篇主要用系统和提炼性的语言对Matlab基础知识进行总结,主要适用于有语言基础的学习者.尽量不讲废话. 第一部分:Matlab是什么? 1 Matlab是Mat ...

  3. semantic框架 - selection dropdown自定义样式

    semantic和Bootstrap是我最常用的前端框架. 这次需求,是要修改selection dropdown. 直接贴代码,不解释. .ui.form input:not([type]):foc ...

  4. iOS开发-消息初认识

    一.消息循环(runLoop)的作用 1,防止程序退出, 2,接受事件 3,如果没有事件,让程序自动休眠   二.消息源    1, 输入源:键盘.鼠标.NSBoard.NSPort    2,定时源 ...

  5. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:循环神经网络预测正弦函数

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 定义RNN的参数. HIDDEN_SIZE = ...

  6. LeetCode No.154,155,156

    No.154 FindMin 寻找旋转排序数组中的最小值 II 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7 ...

  7. Kubernetes系列三:二进制安装Kubernetes环境

    安装环境: # 三个节点信息 192.168.31.11 主机名:env11 角色:部署Master节点/Node节点/ETCD节点 192.168.31.12 主机名:env12 角色:部署Node ...

  8. TPO3-2Deletion of Ogallala Aquifer

    In the face of the upcoming water supply crisis, a number of grandiose schemes have been developed t ...

  9. 【Java杂货铺】用Security做权限极简入门

    原来大多数单体项目都是用的shiro,随着分布式的逐渐普及以及与Spring的天生自然的结合.Spring Security安全框架越受大家的青睐.本文会教你用SpringSecurity设计单项目的 ...

  10. 基础篇八:log配置

    第一:首选查看有哪些日志文件 cd /etc/nginx/ cat nginx.conf cd /var/log/nginx/