我只是想知道是什么样的之间的区别RDD
和DataFrame
(星火2.0.0数据帧是一个单纯的类型别名Dataset[Row]
)在Apache的火花?
你可以转换一个到另一个?
我只是想知道是什么样的之间的区别RDD
和DataFrame
(星火2.0.0数据帧是一个单纯的类型别名Dataset[Row]
)在Apache的火花?
你可以转换一个到另一个?
一个DataFrame
用谷歌搜索“数据帧定义”明确定义的:
数据帧是一个表,或二维阵列状的结构,其中每一列包含一个可变的测量,并且每行包含一个案件。
因此,一个DataFrame
有额外的元数据,因为它以表格格式,这使得星火运行在完成查询某些优化。
一个RDD
,另一方面,仅仅是A R esilient d istributed d ataset是比较数据的黑盒不能作为可以针对它要执行的操作进行优化的,并不像约束。
但是,你可以从一个数据帧到一个RDD
通过其rdd
方法,你可以从去RDD
的DataFrame
(如果RDD是表格形式)通过toDF
方法
一般而言 ,建议使用DataFrame
在可能情况下,由于内置的查询优化。
第一件事情是
DataFrame
从进化SchemaRDD
。
是的..之间的转换Dataframe
和RDD
是绝对有可能的。
下面是一些示例代码段。
df.rdd
下RDD[Row]
下面是一些选项来创建数据帧。
1) yourrddOffrow.toDF
转换成DataFrame
。
2)使用createDataFrame
SQL上下文的
val df = spark.createDataFrame(rddOfRow, schema)
其中,模式可以与以下一些选项,通过漂亮的描述,后..
从斯卡拉案例类和Scala反射APIimport org.apache.spark.sql.catalyst.ScalaReflection val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]
或使用
Encoders
import org.apache.spark.sql.Encoders val mySchema = Encoders.product[MyCaseClass].schema
如由图式描述也可以使用创建
StructType
和StructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
事实上,现在有3层阿帕奇星火的API ..
RDD
API: 的
RDD
自1.0版本(弹性分布式数据集)API已在火花。的
RDD
API提供了许多转化方法,如map
(),filter
(),和reduce
(),用于对数据执行计算。 每一种方法导致一个新的RDD
表示变换后的数据。 然而,这些方法都只是定义了要执行的操作,并且不进行转换,直到一个动作方法被调用。 动作方法的例子是collect
()和saveAsObjectFile
()。
EET实施例:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
例如:过滤器通过用RDD属性
rdd.filter(_.age > 21)
DataFrame
API 星火1.3中引入了新的
DataFrame
API作为项目钨倡议,旨在改善火花的性能和可扩展性的一部分。 该DataFrame
API引入了一个模式来描述数据的概念,使星火管理模式和唯一的节点之间传递数据,比使用Java序列化一个更有效的方式。该
DataFrame
API是从根本上不同的RDD
API,因为它是建立一个关系查询计划,星火的催化剂优化就可以执行的API。 该API是很自然的开发谁熟悉建筑的查询计划
例如SQL风格:
df.filter("age > 21");
局限性:由于代码是由名称引用数据的属性,这是不可能的编译器捕捉任何错误。 如果属性名称不正确,则误差将只在运行时会检测,会创建查询计划时。
与另一个缺点DataFrame
的API,这是很阶为中心,同时它支持Java,支持是有限的。
例如,创建一个当DataFrame
从现有RDD
的Java对象,星火的催化剂优化不能推断模式,并假定在数据帧的任何对象实现了scala.Product
接口。 Scala的case class
开箱,因为他们实现了这个接口。
Dataset
API 该
Dataset
的API,在星火1.6发布作为API预览,旨在提供两全其美的; 熟悉面向对象的编程风格和编译时类型安全RDD
API,但与催化剂查询优化器的性能优势。 数据集也使用相同的有效离堆存储机制作为DataFrame
API。当涉及到数据序列化的
Dataset
API具有JVM表示(对象)和星火的内部二进制格式之间进行转换编码器的概念。 星火具有内置编码器,这是非常先进的,因为它们生成的字节码与离堆数据交互,并提供按需接入到各个属性,而无需反序列化整个对象。 火花还没有提供实现自定义编码器的API,但计划在将来的版本。此外,该
Dataset
API的设计与Java和Scala的工作同样出色。 当使用Java对象的工作,重要的是,他们是完全豆兼容。
例如Dataset
API SQL风格:
dataset.filter(_.age < 21);
评价比较差异。 之间的DataFrame
和DataSet
:
进一步阅读... databricks 文章
阿帕奇星火提供三种类型的API
这里是RDD,数据帧和数据集之间的API的比较。
主抽象火花提供的是一个弹性的分布式数据集(RDD),其是横跨可并行操作的群集的节点分割元素的集合。
分布式采集:
RDD使用被广泛用于处理和与并行产生大的数据集采用,在群集上分布式算法的MapReduce操作。 它允许用户编写并行计算,使用一组高层次的运营商,而不必担心工作分配和容错能力。
不可变:RDDS组成的记录的集合,其划分的。 分区是并行的在RDD的基本单元,并且每个分区是其是不可变的,并通过对现有partitions.Immutability一些转换创建有助于计算以实现一致性数据的一个逻辑划分。
容错:在一个情况下,我们失去RDD的一些分区,我们可以重播在沿袭该分区的改造,实现相同的计算,而不是跨越多个nodes.This特征做数据复制是RDD最大的好处,因为它节省大量的数据管理和复制努力,从而实现更快的计算。
懒惰的评价:在星火所有的转化都懒,因为它们不计算其结果的时候了。 相反,他们只记得应用于一些基础数据集的转换。 当一个操作需要的结果返回到驱动程序的转换只计算。
功能转换:RDDS支持两种类型的操作:转变,从现有的创建一个新的数据集和行动,其上运行的数据集的计算后的值返回驱动程序。
数据处理格式:
它可以很容易且高效地处理其被构造以及非结构化数据的数据。
支持的编程语言:
RDD API是在Java中,斯卡拉,Python和R.可用
没有内置的优化引擎:当处理结构化数据,RDDS不能拿星火先进的优化,包括优化催化剂和钨执行引擎的优势。 开发者需要根据其属性,以优化每个RDD。
处理结构化数据:与数据帧和数据集,RDDS不推断提取数据的模式,并要求用户指定。
Spark在星火1.3版本中引入Dataframes。 据帧克服了RDDS不得不面临的主要挑战。
一个数据帧是组织到指定的列数据的分布式集合。 它在概念上等同于一个表在关系数据库或一R / Python的数据帧。 随着数据框中,星火还推出了催化剂的优化,它利用先进的编程特性来构建一个可扩展的查询优化器。
行对象的分布式采集:一个数据帧是组织到指定的列数据的分布式集合。 这是概念上等同于在关系数据库中的表,但引擎盖下更丰富的优化。
数据处理:处理结构化和非结构化数据格式(阿夫罗,CSV,弹性搜索和卡桑德拉)和存储系统(HDFS,HIVE表,MySQL,等等)。 它可以读取并从所有这些不同的数据源写。
优化利用催化剂优化:它的权力既SQL查询和数据帧API。 在四个阶段数据框中使用催化剂树转换框架,
1.Analyzing a logical plan to resolve references 2.Logical plan optimization 3.Physical planning 4.Code generation to compile parts of the query to Java bytecode.
蜂巢兼容性:使用SQL星火,您可以在现有的蜂巢仓库运行未经修改蜂巢查询。 它重用蜂巢前端和MetaStore并为您提供与现有的蜂房数据,查询和UDF完全兼容。
钨:钨提供whichexplicitly管理存储器中的物理执行后端并动态生成表达式求值的字节码。
支持的编程语言:
据帧API可在Java中,斯卡拉,Python和R.
例:
case class Person(name : String , age : Int)
val dataframe = sqlContext.read.json("people.json")
dataframe.filter("salary > 10000").show
=> throws Exception : cannot resolve 'salary' given input age , name
这是具有挑战性特别是当你正在与几家转型和聚集步骤的工作。
例:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
数据集API是一个扩展到提供一种类型安全,面向对象的编程接口DataFrames。 这是映射到关系模式对象的强类型的,不可变集合。
在数据集的核心,API是一个新概念称为编码器,它负责JVM对象和表格表示之间的转换。 该表格表示使用内部火花钨二进制格式存储的,允许在串行化的数据和改进的存储器利用率操作。 火花1.6配备用于自动生成编码器对多种类型,包括原语类型(例如字符串,整数,长整数),Scala的情况下类和Java豆的支持。
提供了最好的两个RDD和数据帧的:RDD(函数式编程,类型安全),数据帧(关系模型,查询优化调度,钨执行,整理和改组)
编码器:通过使用编码器,很容易对任何JVM对象转换为数据集,让用户与不同数据框结构化和非结构化的数据。
支持的编程语言:数据集API目前仅在Scala和Java中可用。 Python和R的目前没有1.6版本的支持。 Python支持定于2.0版本。
类型安全性:数据集API提供了编译时安全这是不具备的Dataframes。 在下面的例子中,我们可以看到数据集如何与编译lambda函数域对象进行操作。
例:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
// error : value salary is not a member of person
ds.rdd // returns RDD[Person]
例:
ds.select(col("name").as[String], $"age".as[Int]).collect()
为Python和R不支持:从版本1.6,数据集只支持Scala和Java的。 Python支持将在星火2.0推出。
数据集API中的几个优点在现有RDD和数据帧API提供更好的类型安全性和功能性programming.With的API型铸造需求的挑战带来了,你还没有所需的类型安全,将让你的代码脆。
主抽象火花提供的是一个弹性的分布式数据集(RDD),其是横跨可并行操作的群集的节点分割元素的集合。
分布式采集:
RDD使用被广泛用于处理和与并行产生大的数据集采用,在群集上分布式算法的MapReduce操作。 它允许用户编写并行计算,使用一组高层次的运营商,而不必担心工作分配和容错能力。
不可变:RDDS组成的记录的集合,其划分的。 分区是并行的在RDD的基本单元,并且每个分区是其是不可变的,并通过对现有partitions.Immutability一些转换创建有助于计算以实现一致性数据的一个逻辑划分。
容错:在一个情况下,我们失去RDD的一些分区,我们可以重播在沿袭该分区的改造,实现相同的计算,而不是跨越多个nodes.This特征做数据复制是RDD最大的好处,因为它节省大量的数据管理和复制努力,从而实现更快的计算。
懒惰的评价:在星火所有的转化都懒,因为它们不计算其结果的时候了。 相反,他们只记得应用于一些基础数据集的转换。 当一个操作需要的结果返回到驱动程序的转换只计算。
功能转换:RDDS支持两种类型的操作:转变,从现有的创建一个新的数据集和行动,其上运行的数据集的计算后的值返回驱动程序。
数据处理格式:
它可以很容易且高效地处理其被构造以及非结构化数据的数据。
没有内置的优化引擎:当处理结构化数据,RDDS不能拿星火先进的优化,包括优化催化剂和钨执行引擎的优势。 开发者需要根据其属性,以优化每个RDD。
处理结构化数据:与数据帧和数据集,RDDS不推断提取数据的模式,并要求用户指定。
Spark在星火1.3版本中引入Dataframes。 据帧克服了RDDS不得不面临的主要挑战。
一个数据帧是组织到指定的列数据的分布式集合。 它在概念上等同于一个表在关系数据库或一R / Python的数据帧。 随着数据框中,星火还推出了催化剂的优化,它利用先进的编程特性来构建一个可扩展的查询优化器。
行对象的分布式采集:一个数据帧是组织到指定的列数据的分布式集合。 这是概念上等同于在关系数据库中的表,但引擎盖下更丰富的优化。
数据处理:处理结构化和非结构化数据格式(阿夫罗,CSV,弹性搜索和卡桑德拉)和存储系统(HDFS,HIVE表,MySQL,等等)。 它可以读取并从所有这些不同的数据源写。
优化利用催化剂优化:它的权力既SQL查询和数据帧API。 在四个阶段数据框中使用催化剂树转换框架,
1.Analyzing a logical plan to resolve references 2.Logical plan optimization 3.Physical planning 4.Code generation to compile parts of the query to Java bytecode.
蜂巢兼容性:使用SQL星火,您可以在现有的蜂巢仓库运行未经修改蜂巢查询。 它重用蜂巢前端和MetaStore并为您提供与现有的蜂房数据,查询和UDF完全兼容。
钨:钨提供whichexplicitly管理存储器中的物理执行后端并动态生成表达式求值的字节码。
支持的编程语言:
据帧API可在Java中,斯卡拉,Python和R.
例:
case class Person(name : String , age : Int)
val dataframe = sqlContect.read.json("people.json")
dataframe.filter("salary > 10000").show
=> throws Exception : cannot resolve 'salary' given input age , name
这是具有挑战性特别是当你正在与几家转型和聚集步骤的工作。
例:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContect.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
数据集API是一个扩展到提供一种类型安全,面向对象的编程接口DataFrames。 这是映射到关系模式对象的强类型的,不可变集合。
在数据集的核心,API是一个新概念称为编码器,它负责JVM对象和表格表示之间的转换。 该表格表示使用内部火花钨二进制格式存储的,允许在串行化的数据和改进的存储器利用率操作。 火花1.6配备用于自动生成编码器对多种类型,包括原语类型(例如字符串,整数,长整数),Scala的情况下类和Java豆的支持。
提供了最好的两个RDD和数据帧的:RDD(函数式编程,类型安全),数据帧(关系模型,查询优化调度,钨执行,整理和改组)
编码器:通过使用编码器,很容易对任何JVM对象转换为数据集,让用户与不同数据框结构化和非结构化的数据。
支持的编程语言:数据集API目前仅在Scala和Java中可用。 Python和R的目前没有1.6版本的支持。 Python支持定于2.0版本。
类型安全性:数据集API提供了编译时安全这是不具备的Dataframes。 在下面的例子中,我们可以看到数据集如何与编译lambda函数域对象进行操作。
例:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContect.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
// error : value salary is not a member of person
ds.rdd // returns RDD[Person]
例:
ds.select(col("name").as[String], $"age".as[Int]).collect()
为Python和R不支持:从版本1.6,数据集只支持Scala和Java的。 Python支持将在星火2.0推出。
数据集API中的几个优点在现有RDD和数据帧API提供更好的类型安全性和功能性programming.With的API型铸造需求的挑战带来了,你还没有所需的类型安全,将让你的代码脆。
图片来源
RDD
是可并行操作上的元件的容错集合。
DataFrame
被组织成一个名为列的数据集。 它在概念上等同的表在关系数据库或在R / Python中的数据帧, 但与罩下更丰富的优化 。
Dataset
是数据的分布式集合。 数据集是Spark 1.6,提供RDDS的好处 (强类型,使用强大的拉姆达职能的能力)与星火SQL的优化的执行引擎的优势增加了一个新的接口。注意:
行的数据集 (
Dataset[Row]
)Scala中/ Java将经常提到作为DataFrames。
资源
问:您可以将一个到其他类似RDD到数据帧或反之亦然?
1. RDD
到DataFrame
与.toDF()
val rowsRdd: RDD[Row] = sc.parallelize(
Seq(
Row("first", 2.0, 7.0),
Row("second", 3.5, 2.5),
Row("third", 7.0, 5.9)
)
)
val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")
df.show()
+------+----+----+
| id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+
更多的方法: 在星火转换的RDD对象数据帧
2. DataFrame
/ DataSet
到RDD
与.rdd()
方法
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
简单地RDD
是芯组件,但DataFrame
是在火花1.30引入的API。
数据分区的集合称为RDD
。 这些RDD
必须遵循一些属性是这样的:
这里RDD
或者是结构化或非结构化的。
DataFrame
是Scala,Java,Python和R.可用的API它允许以处理任何类型的结构化和半结构化数据的。 要定义DataFrame
,组织成所谓的命名的列分布数据的集合DataFrame
。 您可以轻松地优化RDDs
的DataFrame
。 您可以通过使用一次处理JSON数据,实木复合地板的数据,HiveQL数据DataFrame
。
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
这里Sample_DF考虑为DataFrame
。 sampleRDD
是(原始数据)称为RDD
。
由于DataFrame
是弱类型和开发商都没有得到类型系统的好处。 例如,假设你想读的东西SQL和运行它的一些汇总:
val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")
people.filter("age > 30")
.join(department, people("deptId") === department("id"))
.groupBy(department("name"), "gender")
.agg(avg(people("salary")), max(people("age")))
当你说people("deptId")
你没有得到回一个Int
,或Long
,你找回一个Column
,你需要操作的对象。 在具有丰富的类型系统,如Scala的语言,你最终失去所有的类型安全这增加了运行时错误的数量事情会在编译时被发现。
相反, DataSet[T]
键入。 当你这样做:
val people: People = val people = sqlContext.read.parquet("...").as[People]
你居然取回一个People
的对象,其中deptId
是一个实际的整数类型而不是列类型,从而利用类型系统的优势。
火花2.0的,数据帧和数据集的API将统一,其中DataFrame
将是一个类型别名DataSet[Row]
。
大多数的答案都是正确的只是想在这里补充一点
在火花2.0两种API(数据帧+数据集)将被一起统一成一个单一的API。
“统一数据帧和数据集:在斯卡拉和Java,数据帧和数据集已经统一,即数据帧仅仅是行的数据集一个类型别名在Python和R,由于缺乏类型安全的,数据帧是主要的编程接口。”
数据集是类似RDDS,然而,代替使用Java序列或它们KRYO使用一个专门的编码器来序列进行处理或通过网络传输的对象。
星火SQL支持,将现有RDDS为数据集两种不同的方法。 第一种方法使用反射来推断包含特定类型的对象的RDD的模式。 这样的反思为基础的方法导致了更简洁的代码和效果很好,当你已经知道的模式,而写你的星火应用。
创建数据集的第二种方法是通过编程接口,使您可以构建一个架构,然后将其应用到现有的RDD。 虽然这种方法更详细的,它可以让你构建数据集时,列及其类型不知道,直到运行时。
在这里,你可以找到RDD TOF数据帧的谈话答案
如何RDD对象转换为数据帧中的火花
一个数据帧就相当于在RDBMS表中,也可以以类似的方式在RDDS“本地”分布式集合操作。 不像RDDS,Dataframes跟踪模式,并支持导致更优化的执行各种关系操作。 每个数据帧对象表示逻辑计划,但由于它们的“懒”性质,直到用户呼叫一个特定的“输出动作”不发生执行。
甲数据帧是行对象的RDD,每个代表一个记录。 一个数据帧也知道它的行的模式(即数据字段)。 虽然Dataframes看起来像常规RDDS,内部,它们存储在一个更有效的方式存储数据,同时其架构的优势。 此外,他们还提供RDDS没有的新业务,如运行SQL查询的能力。 Dataframes可从外部数据源被创建,从查询的结果,或从正规RDDS。
参考:扎哈里亚M.,等人。 学习星火(O'Reilly出版,2015年)
我希望它能帮助!
您可以使用RDD与结构化和非结构化其中为数据帧/数据集只能处理结构化和半结构化数据(其为具有适当的架构)
一个数据帧是有模式的RDD。 你可以把它看成是一个关系数据库表中,每一列有一个名字和一个已知类型。 DataFrames的力量来自于一个事实,即,当你从一个结构化的数据集(JSON,实木复合地板..)创建一个数据帧,Spark是能够通过使传过整个(JSON,实木复合地板..)数据集的推断架构加载。 然后,计算执行计划的时候,星火,可以使用的模式,做大大改善计算的优化。 需要注意的是数据帧星火V1.3.0之前被称为SchemaRDD
所有伟大的答案,并使用每个API有一定的权衡。 DataSet内置是超级API来解决很多问题,但很多时候,如果你了解你的数据,如果处理算法进行了优化,以做很多事情单通道大数据,那么RDD似乎最好的选择RDD仍然是最有效。
使用聚合数据集API仍然消耗内存,并会随着时间的推移更好。