推广

大数据开发:Spark框架Dataset API

iseeyu2年前 (2024-02-21)推广139

从概念上讲,我们可以将Scala中的DataFrame视为通用对象集合Dataset[Row]的别名,其中Row是通用非类型JVM对象,可能包含不同类型的字段。相比之下,Dataset是Scala中或Java中的强类型JVM对象的集合。或者,如Dataset文档所说,Dataset是:

特定域对象的强类型集合,可以使用函数或关系操作进行转换。Scala中的每个Dataset都有一个称为DataFrame的无类型视图,它是一个Dataset Row。

1、有类型的对象、非类型的对象和通用行

在Spark支持的语言中,数据集只在Java和Scala中有意义,而在Python和R中,只有DataFrame有意义。这是因为Python和R不是编译时类型安全的;类型是在执行期间动态推断或分配的,而不是在编译时动态分配的。在Scala和Java中,情况正好相反:类型在编译时绑定到变量和对象。然而,在Scala中,DataFrame只是非类型Dataset[Row]的别名。

Row是Spark中的通用对象类型,它包含可以使用索引访的混合类型的集合。在内部,Spark会操作Row对象,并将它们转换为相应的等效类型。例如,对于Scala或Java和Python,Row中的一个整数字段将分别映射或转换为整数类型:

// In Scala

import org.apache.spark.sql.Row

val row = Row(350, true, “Learning Spark 2E”, null)

# In Python

from pyspark.sql import Row

row = Row(350, True, “Learning Spark 2E”, None)

使用行对象的索引,可以使用公共getter方法访问各个字段:

// In Scala

row.getInt(0)

res23: Int = 350

row.getBoolean(1)

res24: Boolean = true

row.getString(2)

res25: String = Learning Spark 2E

# In Python

row[0]

Out[13]: 350

row[1]

Out[14]: True

row[2]

Out[15]: ‘Learning Spark 2E’

相比之下,类型化对象是JVM中实际的Java或Scala类对象。数据集中的每个元素都映射到一个JVM对象。

2、创建DataSet

与从数据源创建DataFrame一样,在创建数据集时,你必须知道schema。换句话说,你需要了解数据类型。尽管使用JSON和CSV数据可以推断出schema,但对于大型数据集,这是资源密集型的(成本昂贵),非常消耗资源。

在Scala中创建数据集时,为结果数据集指定schema最简单的方法是使用样例类(Case classes)。在Java中,使用JavaBean类(我们在第6章中进一步讨论JavaBean和Scala样例类)。

Scala: 样例类(Case classes)

当你希望将自己的域中特定的对象实例化为数据集时,你可以通过在Scala中定义一个样例类来实例化。作为一个例子,让我们查看JSON文件中从物联网设备读取的集合。

我们的文件有几行JSON字符串,外观如下:

{“device_id”: 198164, “device_name”: “sensor-pad-198164owomcJZ”, “ip”:

“80.55.20.25”, “cca2”: “PL”, “cca3”: “POL”, “cn”: “Poland”, “latitude”:

53.080000, “longitude”: 18.620000, “scale”: “Celsius”, “temp”: 21,

“humidity”: 65, “battery_level”: 8, “c02_level”: 1408,”lcd”: “red”,

“timestamp” :1458081226051}

要将每个JSON条目表示为DeviceIoTData,一种特定领域的对象,我们可以定义一个Scala样例类:

case class DeviceIoTData (battery_level: Long, c02_level: Long,

cca2: String, cca3: String, cn: String, device_id: Long,

device_name: String, humidity: Long, ip: String, latitude: Double,

lcd: String, longitude: Double, scale:String, temp: Long,

timestamp: Long)

一旦定义,我们可以使用它读取文件并将返回的内容Dataset[Row]转换为Dataset[DeviceIoTData](输出被截断以适合页面):

// In Scala

val ds = spark.read

.json(“/databricks-datasets/learning-spark-v2/iot-devices/iot_devices.json”)

.as[DeviceIoTData]

ds: org.apache.spark.sql.Dataset[DeviceIoTData] = [battery_level…]

ds.show(5, false)

+————-|———|—-|—-|————-|———|—+

|battery_level|c02_level|cca2|cca3|cn |device_id|…|

+————-|———|—-|—-|————-|———|—+

|8 |868 |US |USA |United States|1 |…|

|7 |1473 |NO |NOR |Norway |2 |…|

|2 |1556 |IT |ITA |Italy |3 |…|

|6 |1080 |US |USA |United States|4 |…|

|4 |931 |PH |PHL |Philippines |5 |…|

+————-|———|—-|—-|————-|———|—+

only showing top 5 rows

3、Dataset操作

就像你可以在DataFrame上执行转换和操作一样,你也可以使用数据集。根据操作类型的不同,操作结果将会有所不同:

// In Scala

val filterTempDS = ds.filter({d => {d.temp > 30 && d.humidity > 70})

filterTempDS: org.apache.spark.sql.Dataset[DeviceIoTData] = [battery_level…]

filterTempDS.show(5, false)

+————-|———|—-|—-|————-|———|—+

|battery_level|c02_level|cca2|cca3|cn |device_id|…|

+————-|———|—-|—-|————-|———|—+

|0 |1466 |US |USA |United States|17 |…|

|9 |986 |FR |FRA |France |48 |…|

|8 |1436 |US |USA |United States|54 |…|

|4 |1090 |US |USA |United States|63 |…|

|4 |1072 |PH |PHL |Philippines |81 |…|

+————-|———|—-|—-|————-|———|—+

only showing top 5 rows

在此查询中,我们使用一个函数作为数据集方法filter()的参数。这是一个具有很多签名的重载方法。我们使用的版本采用filter(func: (T) > Boolean): Dataset[T] lambda函数func: (T) > Boolean作为参数。

lambda函数的参数是类型为DeviceIoTData的JVM对象。这样,我们可以使用点(.)表示法访问其各个数据字段,就像在Scala类或JavaBean中一样。

另一件需要注意的事情是,对于DataFrame,你将filter()条件表示为类似SQL的DSL操作,这些操作是与语言无关的。对于数据集,我们利用原生语言的表达式作为Scala或Java代码。

总的来说,我们可以在数据集上执行filter(),map(),groupBy(),select(),take()这些操作,与DataFrame上的操作相似。在某种程度上,数据集与RDD相似,因为它们提供了与上述方法类似的接口以及编译时安全性,但具有更容易读取和面向对象的编程接口。

当我们使用数据集时,底层的Spark SQL引擎会处理JVM对象的创建、控制版本、序列化和反序列化。它还借助数据集编码器来处理Java外堆内存管理。

关于大数据开发学习,Spark框架Dataset API,以上就为大家做了简单的介绍了。Spark在大数据学习当中,是非常重要的一块,而API编程,是必须要掌握的重要基础,建议多家练习。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57068.html

相关文章

小编教你企业seo优化有哪些小技巧可以运用。

小编教你企业seo优化有哪些小技巧可以运用。

大家知道网站要思考和注意很多的细节问题。当今大多数的网站架构都选用了div和css来做。主要还是由于比较利于seo优化。当然这只是众多细节中的一种,那么企业网站优化还可以利用呢? seo是利用搜索原理结合客户习惯,把网站或者产品得到曝光。讲究的是软推销,吸引的是有需求的用户。把产...

天猫入驻费用标准有哪些(天猫入驻流程及费用标准)

天猫入驻费用标准有哪些(天猫入驻流程及费用标准)

天猫店铺在淘宝众多类型的店铺中,天然权重是最高的一种,能够更加容易获得消费者的认可,在直通车等工具的使用中,也有明显的优势。也正是因为这些优势,开一家天猫店需要的条件和费用也是比较多的...

低成本软文推广营销方案(策划一个简单的软文营销方案)

低成本软文推广营销方案(策划一个简单的软文营销方案)

低成本软文方案(一个简单的方案)。软文推广具有低成本、传播广、持续性强、易于、适用范围广等特点。拥有着提升的知名度、美誉度等方面的最有效的推广方式。是品牌推广中必不可少的营销方式,既然软文营销的优势这么明显,那么我们应该如何利用软文推广来提升排名的知名度呢?一、软文标题要标...

我来分享全网推广外包的优势有哪些。

我来分享全网推广外包的优势有哪些。

全网推广营销和SEO优化是两个不同的概念。现在很多转型互联网的企业,需要做的无非就是全网推广营销和SEO优化。全网推广营销主要做的内容是推广,大大增加企业曝光度,打造企业品牌知名度。那么企业自己做全网营销有些困难,就需要找专业的全网推广公司,找他们又有什么呢? 1、节省资源,减少成本...

网站关键要素之设计与定位。

网站关键要素之设计与定位。

设计对网站的化学作用 网站设计其实就是生产网站,把文字、图片和表格通过使超文件标示语言放置到网站页面。或者再运用一下更复杂的技术处理更多的信息,网站的内容要能充分吸引访问者的注意力,让访问者产生视觉上的愉悦感。 网站设计就是将建站的策划内容、网站的主题结构在通过自己的定义用艺术...

我来教你响应式网站与手机网站有什么区别。

我来教你响应式网站与手机网站有什么区别。

响应式与手机网站? 随着智智能手机以及ipad等通讯设备的广泛应用,网站样式风格也与时俱进,在满足PC端计算机的浏览时,移动端同样适合访客浏览,作为一些企业公司和个人,他们在网络营销方面有着更加严格的需求,既要符合网站品牌形象和访客的体验度,又要网站符合搜索引擎规则,进行网站SEO优化等工作,为此...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片