SparkSQL操作RDD转DataFrame

SparkSQL中 RDD,DF和DS之间的相互转换 类型之间的转换总结 RDD、DataFrame、Dataset 三者有许多共性,有各自适用的场景常常需要在三者之间转换DataFrame/Dataset 转RDD: 这个转换很简单 val rdd1=testDF.rdd val rdd2=testDS.rdd RDD 转DataFrame: import spark.implicits._ val testDF = rdd.map {l... 阅读详情

SparkSQL操作RDD两种方式对比

1.使用反射推断Schema类型,具体解析参考下面的官网描述

The Scala interface for Spark SQL supports automatically converting an RDD containing case classes to a DataFrame. The case class defines the schema of the table. The names of the arguments to the case class are read using reflection and become the names of the columns. Case classes can also be nested or contain complex types such as Sequences or Arrays. This RDD can be implicitly converted to a DataFrame and then be registered as a table. Tables can be used in subsequent SQL statements.

ps:
import sqlContext.implicits._
case class Person(name: String, age: Int)

// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._

// Define the schema using a case class.
// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,
// you can use custom classes that implement the Product interface.
case class Person(name: String, age: Int)

// Create an RDD of Person objects and register it as a table.
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")

// SQL statements can be run by using the sql methods provided by sqlContext.
val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")

// The results of SQL queries are DataFrames and support all the normal RDD operations.
// The columns of a row in the result can be accessed by field index:
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)

// or by field name:
teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)

// row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T]
teenagers.map(_.getValuesMap[Any](List("name", "age"))).collect().foreach(println)
// Map("name" -> "Justin", "age" -> 19)
2.使用编程方式制定Schema类型,具体解析参考下面的官网描述

When case classes cannot be defined ahead of time (for example, the structure of records is encoded in a string, or a text dataset will be parsed and fields will be projected differently for different users), a DataFrame can be created programmatically with three steps.

  1. Create an RDD of Rows from the original RDD;
  2. Create the schema represented by a StructType matching the structure of Rows in the RDD created in Step 1.
  3. Apply the schema to the RDD of Rows via createDataFrame method provided by SQLContext.

ps:
val schemaString = “name age”
val schema =
StructType(
schemaString.split(” “).map(fieldName => StructField(fieldName, StringType, true)))

// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// Create an RDD
val people = sc.textFile("examples/src/main/resources/people.txt")

// The schema is encoded in a string
val schemaString = "name age"

// Import Row.
import org.apache.spark.sql.Row;

// Import Spark SQL data types
import org.apache.spark.sql.types.{StructType,StructField,StringType};

// Generate the schema based on the string of schema
val schema =
  StructType(
    schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

// Convert records of the RDD (people) to Rows.
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))

// Apply the schema to the RDD.
val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)

// Register the DataFrames as a table.
peopleDataFrame.registerTempTable("people")

// SQL statements can be run by using the sql methods provided by sqlContext.
val results = sqlContext.sql("SELECT name FROM people")

// The results of SQL queries are DataFrames and support all the normal RDD operations.
// The columns of a row in the result can be accessed by field index or by field name.
results.map(t => "Name: " + t(0)).collect().foreach(println)
对比总结

1.case class模板类模式可视化比较好
2.case class模板类参数上限为22个,对于字段多的不能使用
3.编程方式更适合日常开发

代码实现

数据源

Michael,20
Andy,30
Justin,19
1.反射
package Sql

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by Administrator on 2016/12/6.
  *  textFlie -> table
    Michael,20
    Andy,30
    Justin,19
    需要添加import sqlContext.implicits._,才可以调用.toDF
    定义People格式
    testFile->map(p=>People(p(1),p(2))) ->DataFrame->Table
    可以是用Sql.Context.sql("Sql语句")
  */
object Sqltest3 {
  case class User(name:String,age:Int)
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf() //创建SparkConf对象
    //设置应用程序的名称,在程序运行的监控界面可以看到名称
    conf.setAppName("SparkSql App!")
    //此时,程序在本地运行,不需要安装Spark集群
    conf.setMaster("local[2]")
    //创建SparkContext对象,通过传入SparkConf实例来定制Spark运行的具体参数和配置信息
    val ssc = new SparkContext(conf)
    ssc.setLogLevel("ERROR")
    //加载SQL对象
    val sqlContext = new SQLContext(ssc)

    //加载数据
    val dr =  ssc.textFile("d://sparktest/people2.txt")
    import sqlContext.implicits._
    val df = dr.map(_.split(","))
               .map(p => User(p(0), p(1).trim.toInt)).toDF()
    //注册到临时表
    df.registerTempTable("user")
    //输出, df 的数据类型
    df.printSchema()
    //输出所有名字
    df.select("name").show()
    df.filter(df("age") > 21).show()
    df.groupBy("age").count().show()
    val teenagers = sqlContext.sql("SELECT name, age FROM user WHERE age >= 13 AND age <= 19")
    teenagers.map(t => "Name: " + t(0)).collect().foreach(println)

    println("-------")
    ssc.stop()
  }
}
编程方式
package Sql

import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by Administrator on 2016/12/6.
  *  textFlie -> table
    Michael,20
    Andy,30
    Justin,19
    定义列簇格式
    testFile->map(p=>Row(p(1),p(2))) ->转换列簇->DataFrame->Table
    可以是用Sql.Context.sql("Sql语句")
  */
object Sqltest2 {

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf() //创建SparkConf对象
    conf.set("spark.executor.memory", "1g");
    //设置应用程序的名称,在程序运行的监控界面可以看到名称
    conf.setAppName("Wow,TopNGroup App!")
    //此时,程序在本地运行,不需要安装Spark集群
    conf.setMaster("local[2]")
    //创建SparkContext对象,通过传入SparkConf实例来定制Spark运行的具体参数和配置信息

    val ssc = new SparkContext(conf)
    ssc.setLogLevel("ERROR")
    //加载SQL对象
    val sqlContext = new SQLContext(ssc)
    //加载数据
    var dr =  ssc.textFile("d://sparktest/people2.txt")
    val schemaString = "name age"
    /*  val schema = StructType(Array(
      StructField("name", StringType, true),
      StructField("age", StringType, true)
    ))*/
    val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
    val rowRDD = dr.map(_.split(",")).map(p => Row(p(0), p(1)))
    val df = sqlContext.createDataFrame(rowRDD, schema)

    //注册到临时表
    df.registerTempTable("user")
    //输出, df 的数据类型
    df.printSchema()
    //输出所有名字
    df.select("name").show()
    df.filter(df("age") > 21).show()
    df.groupBy("age").count().show()
    val teenagers = sqlContext.sql("SELECT name, age FROM user WHERE age >= 13 AND age <= 19")
    teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
    println("-------")
    ssc.stop()
  }
}
Spark(42) -- SparkStreaming -- reduceByKeyAndWindow 函数详解 1. 图解 2. 代码演示 3. 执行步骤 4. window 函数补充(窗口函数) 5. 集成 SparkSQL补充 5.1 案例:仅统计处理时间内数据 5.2 有状态统计 阅读详情

相关推荐

【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化

本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。

weixin_42526417的博客 170

Spark创建DataFrame的三种方法

Spark创建DataFrame的三种方法

qq_40078490的博客 5113

Triplet Loss调参实战:Margin选多少?距离函数用哪个?我的模型为什么训不动?

本文深入探讨了Triplet Loss调参中的关键问题,包括margin参数的选择、距离函数的比较以及模型训练不动的常见原因。通过实战案例和技术分析,提供了针对不同场景(如人脸识别、商品图像、文本匹配)的margin黄金区间,并对比了欧式距离与余弦相似度的适用场景。文章还介绍了困难样本挖掘的最新策略和模型诊断的实用清单,帮助开发者高效解决度量学习中的工程难题。

weixin_29050271的博客 411

Spark DataFrame之创建DataFrame

创建DataFrame的各种例子代码,主要是用来构造测试用例,方便快速测试方法、UDF之类。 参考spark官方文档 总共15个例子,每个例子分别使用了scala和python语言code,两种语言的例子是一一对应的,序号相同的就是同一个例子。 包括Array、Seq数据格式存储的数据,包括稀疏向量、稠密向量的特征列,包括含有缺失值的列等,看完就再也不怕用各种奇形怪状的数据类型来创建DataFrame了。 一、In Scala 1、常规情况 val dataset = spark.create

Toby的博客 3130

李宏毅机器学习笔记第17周_概述领域自适应(Domain Adaptation)

Domain Adaptation

peaunt1的博客 1104

TouchGFX使用教程(三)

TouchGFX使用教程(三)界面事件控件修改方法图片等资源放置位置 界面事件 控件修改方法 图片等资源放置位置

yuanzhan11的专栏 6972

Spark创建DataFrame

1. DataFrame 在Spark中可以通过RDD转换为DataFrame,也可以通过DataFrame转化为RDD,DataFrame可以理解为数据的一个格式,实质show()就是一张表。 读取数据构造DataFrame主要有以下几种方式: 从Json文件中读取 通过SQLContext构造类对象构造DataFrame 动态创建Schema构造当前的DataFrame结构 从parquet文件中读取 从MySQL中读取数据 从Hive中读取数据 2. 从json文件读取构造DataFrame p

AaronCao 1130

基于Costas环的载波同步实现及Matlab仿真

其中,第一个相位环接收带噪声的待同步载波,并产生一个相位误差信号,这个误差信号再通过第二个相位环进行反馈控制,使得两个相位环的相位差保持为90度,最终输出同步载波信号。接下来,我们可以编写Costas环的仿真程序,并将上面生成的信号输入到Costas环中进行同步,最终输出同步后的载波信号。综上所述,本文介绍了如何使用Matlab实现基于Costas环的载波同步,并给出相应的源代码。上述代码中,我们初始化了Costas环的各个参数,然后通过循环迭代实现了相位估计和相位误差控制,最终输出了同步后的载波信号。

2301_78484069的博客 1048

DataFrame转换为RDD_大数据培训

2)将DataFrame转换为RDD。1)创建一个DataFrame。

zjjcchina的博客 1598

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1146

军品研制过程-转阶段

介绍军品转阶段评审

Abel的博客 2万+

SparkSql------RDD、DataFrame、DataSet之间的相互转化

在老的版本中,SparkSQL提供两种SQL查询起始点,一个叫SQLContext,用于Spark自己提供的SQL查询,一个叫HiveContext,用于连接Hive的查询,SparkSession是Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用...

洛云凡 609

OsgEarth —— 笔记1 - 创建地球的earth文件

效果         正文      1、准备一张全球的渲染图(tif格式)、一张全球的高程图(tif格式)        2、创建并编写.earth文件           在步骤1目录下创建china-simple.earth,并将如下内容写入。 <map name="Globe" type="geocentric" version="2"> <!-- 全球影像图 --> <image name="GlobeImage" driver="gdal"> &l

7681

sparkSql 中的dataFram的使用 通过json文件创建DataFrame

如果是使用sparksql的话,我们需要创建SQLContext的上下问,可以传入conf对象,或者 sparkContext对象 读取json文件创建一个DataFram sqlContext.read.json(“json文件名”). 使用json文件创建datafram时他会直接解析json中的格式,将json中每一条记录里面的key作为了scheme,我们可以直接使用spa...

一夜飘零 8442

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spark重温笔记(四):秒级处理庞大数据量的 SparkSQL 操作大全,能否成为你的工作备忘指南?

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。sparkSQL的四个特性1-易整合:将sql查询与spark程序无缝混合,可以使用java、scala、python、R等语言的API操作。2-统一的数据访问:以相同的方式连接到任何数据源。3-兼容hive: 支持Hive HQL的语法,兼容hive(元数据库、SQL语法、UDF、序列化、反序列化机制)。

m0_60732994的博客 1821

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

四、SparkSQL

Spark SQL Spark SQL可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系操作 可以支持大量的数据源和数据分析算法,组合使用Sparl SQL和Spark MLlib DataFrame Spark SQL使用的数据抽象是DataFrame SparkSession DataFrame创建 样例 >>> df = spark.read.json("file:///usr/local/spark/examples/src/main/resour

LittleFish0820 1025

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spark SQL 详解

文章目录RDD、dataframe、dataset的区别和联系封装spark和SCrdd、dataframe、dataset互相转换rdd转dataframe、datasetdf转rdd、dsds转rdd、dfdataframe的创建读取文本文件创建DataFrame读取json文件创建DataFrame读取parquet列式存储格式文件创建DataFrame读取mysql数据通过idea通过服务器spark-shell通过idea将数据写入到mysqlDSL风格和SQL风格DSL风格语法SQL风格语法sp

WGS. 1566

别再死记硬背了!用SparkSQL DataFrame处理CSV/JSON数据的5种实战姿势(附避坑点)

本文详细介绍了使用SparkSQL DataFrame高效处理CSV/JSON数据的5种实战方法,包括从CSV文件创建DataFrame、处理JSON数据、RDD转换DataFrame、临时视图与SQL查询以及DSL语法技巧。文章还提供了常见问题的解决方案和避坑指南,帮助开发者提升数据处理效率。

banghuo2937的博客 382

Spark编程基础:(实验四)Sark SQL**编程初级实践**

spark = SparkSession.builder.appName("RDD转换成DataFrame").config(conf=SparkConf()).getOrCreate()(2)进入saprk,配置 Spark通过 JDBC 连按数据库 MySQL,编程实现利用 DataFrame 插入数据到 MySQL 中,最后打印出 age 的最大值和 age 的总和。(8)查询所有记录的 name 列,并为其取别名为 userame;(2)查询所有数据,并去除重复的数据;

m0_73832851的博客 1244

SparkSql---RDD DataFrame DataSet

DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 SparkSQL 优化执行引擎的优点。DataFrame 与 RDD 的主要区别在于,RDD只关心数据,而DataFrame中也包含数据描述信息(数据的元数据)。DataFrame 其实就是 DataSet 的一个特例 ,因为DataFrame中每行的类型都是Row。定义一个名为user的json文件,文件中的数据如下。

weixin_47109902的博客 2046

Spark SQL RDD与DataFrames相互转换

一 、spark-SQL的DataFrame与RDD的相互转换通常有两种(spark 1.6.x): 第一种方式是使用反射机制推断RDD中schema和类型信息。适用于已知schema的场景; 第二种方式是通过程序接口构造数据的schema,将schema应用于RDD,此方式适用于程序开发时才能确定数据schema、类型的场景。 1.1 第一种,通过反射推断schema信息      sp

风筝中有风 4462

SparkSQL 中 DataFrame 的转换

在大数据处理领域,SparkSQL 凭借其强大的数据处理能力和高效的计算性能备受青睐。其中,DataFrame 作为重要的数据结构,掌握它与其他数据类型(如 RDD、DataSet)之间的转换操作至关重要。今天,我们就深入探讨在 Spark 中如何进行 DataFrame 的转换,帮助大家更好地驾驭 SparkSQL 处理各类数据场景。

天冬忘忧的博客 1698

配置sparksql读hive,dataframe和RDD,将RDD转换成Dataframe,视图,withcolumn

退出spark-shell :quit 使用spark自带文件 [hadoop@hadoop000 resources]$ pwd /home/hadoop/app/spark-2.4.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources scala&amp;amp;amp;amp;amp;amp;gt; val df = spark.read.json(&amp;amp;amp;amp;amp;quot;file:///hom

qq_36459386的博客 2545

SparkSQL和RDD,DataFrame,DataSet的转换

1.简介: ​ SparkSQL的前身是Shark,Shark的底层实现是依赖于Hive,Shark的发展受制于Hive的发展,后来项目组将Shark项目废弃,保留了其中的一些非常优秀的特点:比如内存列存储技术,动态字节码技术等等,重新组织了一个项目,这个项目就是SparkSQL,同时在hive里面也推出了一个子模块,是hive的计算引擎基于spark,hive-on-spark ​ 需要明确...

weixin_44142672的博客 3000

SparkSQL与RDD

1.RDD是Spark的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集2.RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布3.在集群中的不同节点上(分区即partition),从而让RDD中的数据可以被并行操作。(分布式的特性)4.RDD通常通过Hadoop上的文件,即HDFS文件,来进行创建;有时也可以通过Spark应用程序中的集合来创建。

2401_83215220的博客 1173
上一篇: SparkSql官方文档
下一篇: HBase RowKey散列和预分区
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值