目的

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. ios ktvhttpcache 音视频缓存插件使用

    1.PodFile 文件增加 pod 'KTVHTTPCache',  '~> 2.0.0' 2.在终端 需要先cd到podfile文件所在目录  执行pod install 3.在header ...

  2. Java进行http请求时,放置会话信息到header里面

    public class CreateHttpTest { public static void main(String[] args) { createHttp(); } public static ...

  3. windows下查看rabbitmq服务是否启动

    1.命令行进入rabbitmq的安装目录下: 如下图1步骤 2.输入命令 rabbitmqctl1 status 如下图2步骤 3.有时会提示报错,如步骤3 解决办法: 我的电脑 ==> 右键 ...

  4. dubbo的灰度发布

    1,什么是灰度发布 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用. 可以按照以下的步骤进行版本迁移: 在低压力时间段,先升级一半提供者为新版本 再将所有消费者升级为 ...

  5. G. Minimum Possible LCM

    https://codeforces.com/contest/1154/problem/G #include<bits/stdc++.h> using namespace std; typ ...

  6. JDK8stream将list转Map对象报错java.lang.IllegalStateException

    ​ JDK8有很多新特性,比如lambda表达式,函数式编程以及stream流的使用,这几个新特性,使用过之后就爱不释手了,比如将list集合通过stream可以直接转换成map对象. 语法: Map ...

  7. Ubuntu16.04中Mysql 5.7 安装配置

    记录在Ubuntu 16.04安装Mysql 5.7时遇到的一些问题. Mysql安装 使用如下命令进行安装: 1 sudo apt-get install mysql-server mysql-cl ...

  8. [LC] 285. Inorder Successor in BST

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Th ...

  9. Educational Codeforces Round 48 (Rated for Div. 2)异或思维

    题:https://codeforces.com/contest/1016/problem/D 题意:有一个 n * m 的矩阵, 现在给你 n 个数, 第 i 个数 a[ i ] 代表 i 这一行所 ...

  10. 导入import的多种形式

    参考资料:anaconda官方资料 一.module(模块) 比如fibo是个模块(.py文件),其中有fib.fib2等函数 第一种形式:import fibo 在当前的符号表中,这并不会直接进入到 ...