Spark Dataframe 的创建方法与存储

Spark SQL支持DataFrame操作的数据源 阅读详情

 

创建方法

一、通过 toDF()函数创建

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

1.1 从本地Seq创建

 

本地序列(seq)转为DataFrame要求数据的内容是指定的非Any数据类型,且各tupple相同位置的数据类型必须一致,否则会因为schema自动变为为Any而报错。

要求Seq的类型为scala.Product的子类型,如Tupple,例Seq[TuppleN[T1,T2,T3...]], Ti不为Any

val someDF = Seq(
  (8, "bat"),
  (64, "mouse"),
  (-27, "horse")
).toDF("number", "word")

调用 someDF.schema.printTreeString()得到someDF的schema:

 

root
|-- number: integer (nullable = false)
|-- word: string (nullable = true)

注意:如果直接用toDF()而不指定列名字,那么默认列名为"_1", "_2", ...

Seq.toDF()的一个弊端是列类型和nullable标志无法被指定

 

1.2 通过rdd+toDF() 创建

类似Seq的创建,要求rdd为RDD[A<: scala.Product], 且A类型中类型不为Any。

直接调用rdd.toDF("列1","列2",...)

 

 

1.3 通过case class的RDD + toDF() 创建

这种方法的好处在于可以指定数据类型,示例:

 

// 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")//得到rdd
                 .map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt))//转为元素为Person的RDD
                 .toDF()//转换为Dataframe

 

二、通过 creatDataFrame()函数创建

主要好处在于可定制schema,包括nullable标志

creatDataFrame()共有7种重载方式:

其中

def createDataFrame[A<: scala.Product](rdd : RDD[A]):DataFrame
def createDataFrame[A<: scala.Product](data : scala.Seq[A]): DataFrame 

跟toDF一样,这里创建DataFrame的数据形态也可以是本地Seq或者RDD

 

其次

def createDataFrame(rowRDD : RDD[Row], schema : StructType) : DataFrame

多了一个StructType参数指定Schema,要求输入为RDD[Row], 示例:

val someData = Seq(
  Row(8, "bat"),
  Row(64, "mouse"),
  Row(-27, "horse")
)

val someSchema = List(
  StructField("number", IntegerType, true),
  StructField("word", StringType, true)
)

val someDF = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

 

另外还有以下几种方法,少用,省略。

 

private[sql] def createDataFrame(rowRDD : org.apache.spark.rdd.RDD[org.apache.spark.sql.Row], schema : StructType, needsConversion : scala.Boolean) : DataFrame 
def createDataFrame(rowRDD : JavaRDD[Row], schema : StructType) : DataFrame
def createDataFrame(rdd : RDD[_], beanClass : scala.Predef.Class[_]) :DataFrame 
def createDataFrame(rdd : JavaRDD[_], beanClass : scala.Predef.Class[_]) :DataFrame

 

关于scala.product

http://daily-scala.blogspot.com/2009/12/product.html

 

 

三、通过读取文件创建

使用parquet文件创建

val df = sqlContext.read.parquet("hdfs:/path/to/file")
val df = sqlContext.read.load("examples/src/main/resources/users.parquet")//Load默认是parquet格式,通过format指定格式
val df = sqlContext.read.format("parquet").load("examples/src/main/resources/users.parquet")

使用json文件创建

val df = spark.read.json("examples/src/main/resources/people.json")//也有load版本
// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

使用csv文件,spark2.0+之后的版本可用

//首先初始化一个SparkSession对象
val spark = org.apache.spark.sql.SparkSession.builder
        .master("local")
        .appName("Spark CSV Reader")
        .getOrCreate;
 
//然后使用SparkSessions对象加载CSV成为DataFrame
val df = spark.read
        .format("com.databricks.spark.csv")
        .option("header", "true") //reading the headers
        .option("mode", "DROPMALFORMED")
        .load("csv/file/path"); //.csv("csv/file/path") //spark 2.0 api
 
df.show()


存储方法

df.write.save("namesAndFavColors.parquet")//默认parque文件存储
df.write.format("类型").save("Path")

储存文件类型转换

val df = sqlContext.read.format("json").load("examples/src/main/resources/people.json")
df.select("name", "age").write.format("parquet").save("namesAndAges.parquet")

存储模式选择

不同的存储模式主要是处理已存在数据采用不同方法

df.write.format("类型").save("Path",SaveMode.Overwrite)  //可以把SaveMode.Overwrite换成其他的几种形式
Scala/JavaAny LanguageMeaning
SaveMode.ErrorIfExists(default)"error"(default)When saving a DataFrame to a data source, if data already exists, an exception is expected to be thrown.
SaveMode.Append"append"When saving a DataFrame to a data source, if data/table already exists, contents of the DataFrame are expected to be appended to existing data.
SaveMode.Overwrite"overwrite"Overwrite mode means that when saving a DataFrame to a data source, if data/table already exists, existing data is expected to be overwritten by the contents of the DataFrame.
SaveMode.Ignore"ignore"Ignore mode means that when saving a DataFrame to a data source, if data already exists, the save operation is expected to not save the contents of the DataFrame and to not change the existing data. This is similar to a CREATE TABLE IF NOT EXISTS in SQL.

存储为持久性的Table

其实前面讲的df.write.save 也可以持久性的写到hdfs等存储介质当中,若果先创建了表格的话,可用如下语句

df.write.format("orc").save("hdfsPath") //
sqlContext.sql("alter table " + table+ " add if not exists partition(pt_d='" + pt_d + "')")//更新hiveMeta信息
//sqlContext.sql("msck repair table"+userClutsersTable)//更新hiveMeta信息

Spark SQL支持对Hive中存储的数据进行读写。操作Hive中的数据时,必须创建HiveContext,而不是SQLContext。HiveContext继承自SQLContext,但是增加了在Hive元数据库中查找表,以及用HiveQL语法编写SQL的功能。除了sql()方法,HiveContext还提供了hql()方法,从而用Hive语法来编译sql。
使用HiveContext,可以执行Hive的大部分功能,包括创建表、往表里导入数据以及用SQL语句查询表中的数据。查询出来的数据是一个Row数组。

 

当使用 HiveContext时,Datafame可用saveAsTable 存为持久性的table。与registerTempTable方法不同的是,saveAsTable将DataFrame中的内容持久化到表中,并在HiveMetastore中存储元数据。

默认情况下,saveAsTable会创建一张Hive Managed Table,也就是说,数据的位置都是由元数据库中的信息控制的。当Managed Table被删除时,表中的数据也会一并被物理删除。
registerTempTable只是注册一个临时的表,只要Spark Application重启或者停止了,那么表就没了。而saveAsTable创建的是物化的表,无论Spark Application重启或者停止,表都会一直存在。
调用HiveContext.table()方法,还可以直接针对Hive中的表,创建一个DataFrame。

// 接着将dataframe中的数据保存到good_student_infos表中
hiveContext.sql("DROP TABLE IF EXISTS biads.good_student_infos")
goodStudentsDF.saveAsTable("biads.sgood_student_infos")
//可以用table()方法,针对hive表,直接创建DataFrame
 DF = hiveContext.table("good_student_infos")

这种方法存到默认位置,位置也可指定,见下:

 

df.write 为DataFrameWriter类,内有很多配置函数,如format,mode,options等,还有save,saveAsTable,json,parquet,orc等写入方法,存储位置可通过options指定:例:

val options = Map("path" -> "hdfs:/...")
df.write.format("orc").partitionBy("partitiondate").options(options).mode(SaveMode.Append).saveAsTable("tablename")

或

df.write.option("path", "hdfs:/...").format("parquet").saveAsTable("address_l‌​ocal") 

 

 

 

DataFrame也有saveAsTable(多重重载),有些提供了很多参数,和上述DataFrameWriter方法类似,例如参数最多的一个实现:

def saveAsTable(tableName : scala.Predef.String, source : scala.Predef.String, mode : org.apache.spark.sql.SaveMode, options : scala.Predef.Map[scala.Predef.String, scala.Predef.String]) : scala.Unit 

但是这种使用方法似乎已经被废弃,应采用DataFrameWriter方法:

 

 

 

 

 

参考资料

https://blog.youkuaiyun.com/martin_liang/article/details/79748503

https://medium.com/@mrpowers/manually-creating-spark-dataframes-b14dae906393

https://spark.apache.org/docs/1.5.1/sql-programming-guide.html

http://spark.apache.org/docs/1.5.1/api/scala/index.html#org.apache.spark.sql.DataFrame

https://blog.youkuaiyun.com/qq_16103331/article/details/53562349

 

 

 

 

Spark第二章——第五章所有方法详解 Spark SQL 是一个用于处理结构化数据的框架,可被视为一个分布式的SQL查询引擎,提供了一个抽象的可编程数据模型DataFrame。2.collect()/collectAsList():获取所有数据。collect()方法查询。1.通过结构化数据文件创建DataFrame。4.通过Hive中的表创建DataFrame。2.通过外部数据库创建DataFrame。1.show():查看数据。3.通过RDD创建DataFrame。一、创建DataFrame对象。二、查看DataFrame数据。 阅读详情

相关推荐

Spark【使用篇】06:Spark SQL

DataFrame常见算子操作、DataFrame的sql操作、RDD转换为DataFrame、load和save操作、SaveMode、内置函数

weixin_40612128的博客 2707

Spark创建DataFrame的三种方法

Spark创建DataFrame的三种方法

qq_40078490的博客 5113

Spark 3.0 - 2.机器学习核心 DataFrame 应用 API 与操作详解

Spark 3.0 DataFrame API 详解。

BITDDD小栈 1258

Spark DataFrame之创建DataFrame

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

Toby的博客 3130

全面解析Apache Spark DataFrame

Catalyst优化器使用了一个树形结构的表示方式来分析和变换逻辑查询计划。优化过程可以分为四个主要阶段:分析(Analysis)、逻辑优化(Logical Optimization)、物理规划(Physical Planning)、以及代码生成(Code Generation)。分析阶段,Catalyst首先解析SQL或DataFrame API的查询,并构建出一个初始的逻辑计划(Logical Plan),该计划用树形结构表示,由一系列的规则(Rule)构成。逻辑优化。

weixin_34598113的博客 1161

DSPACE仿真平台的使用

DSPACE仿真平台的使用 文章目录DSPACE仿真平台的使用1.ModelDesk新建项目2.MotionDesk引入项目3.ControlDesk引入项目4.项目整合运行 我们使用DSPACE仿真平台软件来模拟小汽车的自动驾驶。 总共需要用到DSPACE大类下的三个软件:ModelDesk、ControlDesk、MotionDesk。 1.ModelDesk新建项目 在桌面上点击ModelDesk图标,打开DSPACE—ModelDesk 选择 File 标签,侧边栏选择 New,点击 New A

qq_42582489的博客 7528

spark中RDD、DataFrame创建及互相转换

1. RDD创建方式 parallelize 从一个Seq集合创建RDD。 例如: var rdd = sc.parallelize(1 to 10) makeRDD 这种用法和parallelize完全相同 例如: var collect = Seq((1 to 10,Seq("slave007.lxw1234.com","slave002.lxw1234.c

cqboy1991的专栏 5525

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

【Spark学习笔记】Dataframe操作大全

1. Dataframe的生成 1.1 通过 toDF()函数创建 Seq+toDF val someDF = Seq( (8, "bat"), (64, "mouse"), (-27, "horse") ).toDF("number", "word") 注意:如果直接用toDF()而不指定列名字,那么默认列名为"_1", "_2", ... Seq.toDF()的一个弊端是列类型...

不可能打工的博客 1090

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

基于spark1.3.1的spark-sql实战-01

OK !好久不见,大家都忙着各自的事情,me too, 博客也好久木有更新了,因为一直比较忙 spark sql 三个核心部分: 1. 可以加载各种结构化数据源(e.g., JSON, Hive, and Parquet). 2.  可以让你通过SQL ,spark 内部程序或者外部工具,通过标准的数据库连接(JDBC/ODBC)连接spark,比如一个商业智能的工具Tableau 3.当

stark_summer的专栏 2万+

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

Robot_PLC_HMI_Automation 1515

spark中dataframe解析_【Spark学习笔记】Dataframe操作大全

1. Dataframe的生成1.1 通过 toDF()函数创建Seq+toDFval someDF = Seq((8, "bat"),(64, "mouse"),(-27, "horse")).toDF("number", "word")注意:如果直接用toDF()而不指定列名字,那么默认列名为"_1", "_2", ... Seq.toDF()的一个弊端是列类型和nullable标志无法被指...

weixin_39646725的博客 1038

SAP Joule Studio 能不能用来开发 skill:可以,但它开发的是 Joule 语境下的企业级 skill,而不是替代所有 SAP 开发技术的万能锤

SAP Joule Studio 专为开发Joule技能(Joule skills)而设计,这些技能是执行确定性单步业务动作的原子能力。它通过自然语言接口连接SAP和非SAP系统,适合处理边界清晰、可审计的任务(如创建工单、查询发票)。Joule技能作为会话式业务编排层,与ABAP、CAP等核心技术互补而非替代。开发支持低代码和专业代码两种方式,并具备企业级治理能力,但需要相应的BTP订阅和技术基础。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 202

AI算力网络与通信领域QoS保障的测试方法

在当今数字化时代,AI技术蓬勃发展,AI算力网络应运而生。它将分布在不同地理位置的算力资源进行整合,以高效地支持各种AI应用,如深度学习训练、智能图像识别等。而通信领域则是信息传输的基石,确保数据能够准确、快速地在不同节点之间传递。QoS保障在通信领域至关重要,它可以确保不同类型的业务(如语音通话、视频会议、在线游戏等)获得与其需求相匹配的服务质量。在AI算力网络中,QoS保障同样不可或缺,因为AI任务对网络的带宽、延迟、可靠性等指标有严格要求。

AI算力网络与通信的博客 526

在Spark中,如何使用DataFrame进行高效的数据处理

在Spark中使用DataFrame进行高效的数据处理,主要依赖于DataFrame的分布式计算能力、优化的执行计划、丰富的操作方法和便捷的数据读写能力。

2402_85246552的博客 1196

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1141

从零开始学习大数据之Spark(二)-RDD的创建和Spark SQL中的DataFrame的创建与查看(巨详细新手必备)

RDD和Spark SQL

qq_73780713的博客 2075

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spark进阶(五):DataFrame和DataSet使用

DataFrame是Spark SQL提供的一个编程抽象,与RDD类似,也是一个分布式的数据集合。但与RDD不同的是,DataFrame的数据都被组织到有名字的列中,就像关系型数据库中的表一样。此外,多种数据都可以转化为DataFrame,例如Spark计算过程中生成的RDD、结构化数据文件、Hive中的表、外部数据库等。 在Spark中,一个DataFrame所代表的是一个元素类型为Row的Dataset,即DataFrame只是Dataset[Row]的一个类型别名。相对于RDD,Dataset提供了强

泛泛之素 1684

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

spark DataFrame 多列同时重命名

我们遇到这样一个问题, 1 先生成一个包含所有预置字段的DataFrame(此时的字段名称是英文的) 2 根据传入的条件动态组合字段从1中的大的DataFrame 里 select的到想要的字段 3 但是我想存入的csv文件中要有中文表头 4 遇到的问题是:使用sql 拼接然后as 取别名为中文,会报出不支持 所以想到如下的方法来解决: package ezr.df.drill i...

m0_37813354的博客 4469

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spark编程基础RDD

Scala 是 Scalable Language 的缩写,是一种多范式的编程语言,由洛桑联邦理工学院的马丁·奥德斯在 2001 年基于 Funnel 的工作开始设计,设计初衷是想集成面向对象编程和函数式编程的各种特性。Scala 是一种纯粹的面向对象的语言,每个值都是对象。Scala也是一种西数式语言,因此函数可以当成值使用。由于 Scala 整合了面向对象编程和函数式编程的特性,因此 Scala 相对于 Java、C#、C++等其他语言更加简洁。

qq_73801124的博客 1527

Scala、Spark SQL 常用方法

一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的。与合并不同,连接会对键相同的值进行合并,连接方式多种多样,包含内连接、右外连接、左外连接、全外连接,不同的连接方式需要使用不同的连接方法。Scala定义一个数组的语法格式如下。reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当。方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当。

发财糕 2056

Spark大数据开发与应用案例(视频教学版)(十五)--第十章上

作者: 余辉微信公众号:辉哥大数据备注:本书配套示例源码、PPT课件、教学视频与作者答疑服务,每周更新一部分,敬请期待…红包奖励:找出本书问题,评论区并指正,且留下联系方式。

辉哥大数据 848

spark

在进行处理时,reduceByKey()方法将相同键的前两个值传给输入函数,产生一个新的返回值,新产生的返回值与RDD中相同键的下一个值组成两个元素,再传给输入函数,直到最后每个键只有一个对应的值为止。使用flatMap()方法时先进行map(映射)再进行flat(扁平化)操作,数据会先经过跟map一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的RDD。两个RDD的顺序会影响结果。

dmnjsw的博客 1212
上一篇: Spark Dataframe, Dataset, rdd persist cache触发的巨坑
下一篇: Spark RDD的函数详解
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值