【Spark】这一篇或许能让你大概了解如何通过JavaAPI实现DataFrame的相关操作
文章目录
需求概述
将RDD转换得到DataFrame,主要有两种方法:利用反射机制 和 通过编程结构与RDD进行交互。
步骤
一、创建Maven工程并导包
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.2.0</spark.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
二、选用第一种方法:利用反射机制配合样例类构建DataFrame
开发代码
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
// 定义person case class
case class Person(id: Int,name: String,age: Int)
object SparkDF {
def main(args: Array[String]): Unit = {
// 获取SparkSession
val sparkSession: SparkSession = SparkSession.builder().appName("SparkDF").master("local[2]").config("spark.driver.host", "localhost").getOrCreate()
// 获取SparkContext
val sparkContext: SparkContext = sparkSession.sparkContext
// 过滤筛选日志
sparkContext.setLogLevel("WARN")
//读取文件
val fileRDD: RDD[String] = sparkContext.textFile("/Users/zhaozhuang/Desktop/4、Spark/Spark第三天/Spark第三天教案/资料/person.txt")
//按照分隔符切割数据
val splitRDD: RDD[Array[String]] = fileRDD.map(x => x.split(" "))
//关联person case class
val personRDD: RDD[Person] = splitRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt))
//准备把personRDD转换成DataFrame
//首先要导包
import sparkSession.implicits._
val personDF: DataFrame = personRDD.toDF()
//todo 至此已经成功通过反射机制构建DataFrame
/**
* 接下来可以使用DFL语法和SQL语法验证是否构建成功
*/
println("*******************************************DSL语法测试开始********************************************")
//查看全表数据 show()默认展示前20条数据
personDF.show()
//查看指定字段数据
personDF.select($"name",$"age").show()
//查看schema
personDF.printSchema()
//过滤筛选数据
personDF.filter($"age" > 25).show()
println("*******************************************DSL语法测试结束********************************************")
println("*******************************************SQL语法测试开始********************************************")
// 将DataFrame注册为一张table,有三种方法
//第一种 已过时
val person1: Unit = personDF.registerTempTable("person1")
//第二种
val person2: Unit = personDF.createTempView("person2")
//第三种 (推荐)
val person3: Unit = personDF.createOrReplaceTempView("person3")
//打印三钟表的数据
sparkSession.sql("select * from person1").show()
sparkSession.sql("select * from person2").show()
sparkSession.sql("select * from person3").show()
//实现left join操作
sparkSession.sql("select * from person1 p1 left join person2 p2 on p1.id = p2.id").show()
println("*******************************************SQL语法测试结束********************************************")
sparkContext.stop()
sparkSession.close()
}
}
控制台结果
*******************************************DSL语法测试开始********************************************
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan|108|
| 2| lisi| 28|
| 3| wangwu| 58|
| 4| zhaoliu| 24|
| 5| zhuqi| 35|
| 6| qiuba| 28|
+---+--------+---+
+--------+---+
| name|age|
+--------+---+
|zhangsan|108|
| lisi| 28|
| wangwu| 58|
| zhaoliu| 24|
| zhuqi| 35|
| qiuba| 28|
+--------+---+
root
|-- id: integer (nullable = false)
|-- name: string (nullable = true)
|-- age: integer (nullable = false)
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan|108|
| 2| lisi| 28|
| 3| wangwu| 58|
| 5| zhuqi| 35|
| 6| qiuba| 28|
+---+--------+---+
*******************************************DSL语法测试结束********************************************
*******************************************SQL语法测试开始********************************************
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan|108|
| 2| lisi| 28|
| 3| wangwu| 58|
| 4| zhaoliu| 24|
| 5| zhuqi| 35|
| 6| qiuba| 28|
+---+--------+---+
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan|108|
| 2| lisi| 28|
| 3| wangwu| 58|
| 4| zhaoliu| 24|
| 5| zhuqi| 35|
| 6| qiuba| 28|
+---+--------+---+
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan|108|
| 2| lisi| 28|
| 3| wangwu| 58|
| 4| zhaoliu| 24|
| 5| zhuqi| 35|
| 6| qiuba| 28|
+---+--------+---+
+---+--------+---+---+--------+---+
| id| name|age| id| name|age|
+---+--------+---+---+--------+---+
| 1|zhangsan|108| 1|zhangsan|108|
| 6| qiuba| 28| 6| qiuba| 28|
| 3| wangwu| 58| 3| wangwu| 58|
| 5| zhuqi| 35| 5| zhuqi| 35|
| 4| zhaoliu| 24| 4| zhaoliu| 24|
| 2| lisi| 28| 2| lisi| 28|
+---+--------+---+---+--------+---+
*******************************************SQL语法测试结束********************************************
Process finished with exit code 0
选用第二种方法:通过StrucType配合Row构建DataFrame
开发代码
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
object SparkDF2 {
def main(args: Array[String]): Unit = {
//获取SparkSession
val sparkSession: SparkSession = SparkSession.builder().appName("saprkDF2").master("local[2]").config("spark.driver.host", "localhost").getOrCreate()
//获取SparkContext
val sparkContext: SparkContext = sparkSession.sparkContext
//设置日志筛选
sparkContext.setLogLevel("WARN")
//读取文件
val fileRDD: RDD[String] = sparkContext.textFile("/Users/zhaozhuang/Desktop/4、Spark/Spark第三天/Spark第三天教案/资料/person.txt")
//对数据进行切割
val arrayRDD: RDD[Array[String]] = fileRDD.map(x => x.split(" "))
//将arrayRDD转换为row
val rowRDD: RDD[Row] = arrayRDD.map(x => Row(x(0).toInt, x(1), x(2).toInt))
//获取StructType对象
val structType = new StructType().add("id",IntegerType).add("name",StringType).add("age",IntegerType)
//需要两个参数 RDD[Row] 和 StructType
val personDF: DataFrame = sparkSession.createDataFrame(rowRDD, structType)
//接下来DSL和SQL的操作和之前相同
personDF.printSchema()
sparkContext.stop()
sparkSession.close()
}
}
控制台结果
root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
Process finished with exit code 0
【Spark】这一篇或许能让你大概了解如何通过JavaAPI实现DataFrame的相关操作的更多相关文章
- spark第六篇:Spark Streaming Programming Guide
预览 Spark Streaming是Spark核心API的扩展,支持高扩展,高吞吐量,实时数据流的容错流处理.数据可以从Kafka,Flume或TCP socket等许多来源获取,并且可以使用复杂的 ...
- spark调优篇-数据倾斜(汇总)
数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...
- 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06
百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...
- Spark-读写HBase,SparkStreaming操作,Spark的HBase相关操作
Spark-读写HBase,SparkStreaming操作,Spark的HBase相关操作 1.sparkstreaming实时写入Hbase(saveAsNewAPIHadoopDataset方法 ...
- 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...
- 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...
- 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...
- 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...
- 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...
随机推荐
- 移动硬盘临时文件太多怎么办,python黑科技帮你解决
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 星安果 PS:如果想了解更多关于python的应用,可以私信我,或者 ...
- PHP函数:debug_backtrace
debug_backtrace() - 产生一条 PHP 的回溯跟踪(backtrace). 说明: debug_backtrace ([ int $options = DEBUG_BACKTRAC ...
- 测试需要用到的chrome调试
模拟慢网速 断开网络 F12后勾选上offline 请求304 后来发现是选中了该浏览其的Disable cache,去掉就好了.
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- python3_learn 实现文件夹内批量对图片重命名
初衷 练习Python,提高动手能力. 珍藏的壁纸文件夹名命有点乱. 可以学习下一些基础的库 开始(.jpg,无筛选) First 首先找到OS库,寻找可以遍历文件名的.找到了OS.walk() os ...
- [转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)
PHP7和PHP5上的安全区别 preg_replace()不再支持/e修饰符 利用\e修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述: 如果设置了这个被弃用的修饰符, preg_repl ...
- BUUOJ [CISCN2019 华北赛区 Day2 Web1]Hack World
补一下这道题,顺便发篇博客 不知道今年国赛是什么时候,菜鸡还是来刷刷题好了 0X01 考点 SQL注入.盲注.数字型 0X02自己尝试 尝试输入1 赵师傅需要女朋友吗???随便都能有好吧 输入2 ?? ...
- window 下 jmeter+ant 自动生成html报告并发送邮件
一.安装ant 1.ant 下载地址:https://ant.apache.org/bindownload.cgi 2.下载完成解压到指定目录下 3.配置ant 环境变量 新建系统变量 -ANT_HO ...
- 微信小程序画布(1)
wxml: <view catchtouchmove="preventTouchMove" wx:if="{{canvas_haoBao}}"> ...
- Java中的二分查找
二分查找:(折半查找) 前提:数组必须是有序的. 思想:每次都猜中间的那个元素,比较大或者小,就能减少一半的元素.思路:A:定义最小索引,最大索引. B:比较出中间索引 C:拿中间索引的值和要查找的元 ...