import包:
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SQLContext}
样例类:
case class Person(id:Int,name:String,age:Int)
主函数:
def main(args: Array[String]): Unit = {
val sparkConf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local")
val sparkContext = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sparkContext)
val rdd: RDD[String] = sparkContext.textFile("C:\\Users\\dummy\\Desktop\\person.txt")
val lineRdd: RDD[Array[String]] = rdd.map(_.split(" "))
InferringSchema(lineRdd,sqlContext)
SpecifyingSchema(lineRdd,sqlContext)
sparkContext.stop()
}
第一种方法:(需要创建样例类)
/**
* 通过反射推断Schema
* @param lineRdd
* @param sqlContext
*/
def InferringSchema(lineRdd: RDD[Array[String]],sqlContext:SQLContext): Unit ={
//将RDD和case class关联
val personRdd: RDD[Person] = lineRdd.map(x=>Person(x(0).toInt,x(1),x(2).toInt))
//导入隐式转换,如果不导入无法将RDD转换成DataFrame
import sqlContext.implicits._
//将RDD转换成DataFrame
val personDF: DataFrame = personRdd.toDF()
personDF.show()
//注册一张临时表
//personDF.registerTempTable("person")
//val personDF2: DataFrame = sqlContext.sql("select * from person")
//将结果以JSON的方式存储到指定位置
//personDF2.write.json("C:\\Users\\dummy\\Desktop\\out")
//personDF2.show()
}
第二种方法:
/**
* 通过StructType直接指定Schema
* @param lineRdd
* @param sqlContext
*/
def SpecifyingSchema(lineRdd: RDD[Array[String]],sqlContext:SQLContext): Unit ={
//通过StructType直接指定每个字段的schema
val schema=StructType(
List(
/**StructField只需传入前面两个参数即可
* name: String,
* dataType: DataType,
* nullable: Boolean = true,
* metadata: Metadata = Metadata.empty)
*/
StructField("id",IntegerType),
StructField("name",StringType),
StructField("age",IntegerType)
)
)
val rowRdd: RDD[Row] = lineRdd.map(x=>Row(x(0).toInt,x(1),x(2).toInt))
val personDF: DataFrame = sqlContext.createDataFrame(rowRdd,schema)
//personDF.show()
personDF.registerTempTable("person")
val personDF2: DataFrame = sqlContext.sql("select * from person")
//personDF2.write.json("C:\\Users\\dummy\\Desktop\\out")
personDF2.show()
}
对比:



												

SparkSQL查询程序的两种方法,及其对比的更多相关文章

  1. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

  2. mongodb用子文档做为查询条件的两种方法

    { "_id": ObjectId("52fc6617e97feebe05000000"), "age": 28, "level& ...

  3. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  4. jQuery中清空元素.empty()和.html(''),两种方法的对比

    jQuery 中有 .empty() 和 .html() 两种方式,都能够清空所选父元素中的所有子元素.但是这两者清空元素的方式上,有着很大的区别: 1.empty() jQuery对象.empty( ...

  5. Hibernate 注解和配置文件两种方法的对比(有实例)

    hibernate多对多形式(User类<---->Educate类) 1.基于注解的形式: User类: package com.ssh.entities; import java.ut ...

  6. Oracle中spool命令实现的两种方法比较

    ---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...

  7. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  8. spark-sql将Rdd转换为DataFrame进行操作的两种方法

    SparkConf sparkConf = new SparkConf() .setMaster("local").setAppName("ClzMap"); ...

  9. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

随机推荐

  1. springMvc 添加定时任务

    1.创建定时类 import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stere ...

  2. JAVA中的多态概念

    多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件 需要存在继承和实现关系 同样的方法调用而执行不同操作,运行不同代码. 在运行时父类或者接口的引用变量 ...

  3. MyBatis源码探索

    每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获 ...

  4. xp_delete_files不起作用解决方法

    xp_delete_file用来删除数据库的备份文件和维护计划文本报告.示例: ,N'D:\Backup\Diff',N'bak',N'2019-05-29T10:03:41' 第一个参数表示文件类型 ...

  5. java Vamei快速教程19 嵌套类

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package) ...

  6. linux 命令——23 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  7. IOS tableView的数据刷新

    1.tableView的刷新 1> 数据刷新的总体步骤 * 修改模型数据 * 刷新表格(刷新界面) 2> 刷新表格(刷新界面)的方法 * 全局刷新(每一行都会重新刷新) - (void)r ...

  8. hdu-1198 Farm Irrigation---并查集+模拟(附测试数据)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目大意: 有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种 ...

  9. Spark的调度

    作业调度简介 设计者将资源进行不同粒度的抽象建模,然后将资源统一放入调度器,通过一定的算法进行调度,最终要达到高吞吐或者低访问延时的目的. Spark在各种运行模式中各个角色实现的功能基本一致,只不过 ...

  10. 【51nod1677】treecnt(树上数学题)

    点此看题面 大致题意: 给你一个节点从1~n编号的树,让你从中选择k个节点并通过选择的边联通,且要使选择的边数最少,让你计算对于所有选择k个节点的情况最小选择边数的总和. 题解 这道题乍一看很麻烦:最 ...