教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

怎樣操作DataFrame?不同操作風(fēng)格有什么區(qū)別?

更新時(shí)間:2021年04月14日16時(shí)00分 來(lái)源:傳智教育 瀏覽次數(shù):

傳智教育-一樣的教育,不一樣的品質(zhì)

DataFrame提供了兩種語(yǔ)法風(fēng)格,即DSL風(fēng)格語(yǔ)法和SQL風(fēng)格語(yǔ)法,二者在功能上并無(wú)區(qū)別,僅僅是根據(jù)用戶習(xí)慣,自定義選擇操作方式。接下來(lái),我們通過(guò)兩種語(yǔ)法風(fēng)格,分別講解DataFrame操作的具體方法。

1.DSL風(fēng)格操作

DataFrame提供了一個(gè)領(lǐng)域特定語(yǔ)言(DSL)以方便操作結(jié)構(gòu)化數(shù)據(jù),下面將針對(duì)DSL操作風(fēng)格,講解DataFrame常用操作示例。

show():查看DataFrame中的具體內(nèi)容信息。printSchema():查看DataFrame的Schema信息。select():查看DataFrame中選取部分列的數(shù)據(jù)。

下面演示查看personDF對(duì)象的name字段數(shù)據(jù),具體代碼如下所示。

scala > personDF.select(personDF.col("name")).show()
+--------+|  name |
+--------+|zhangsan|
|   lisi|
| wangwu|
| zhaoliu|
| tianqi||  jerry|
+--------+

上述代碼中,查詢name字段的數(shù)據(jù)還可以直接使用“personDF.select(“name”).show”代碼直接查詢。

select()操作還可以實(shí)現(xiàn)對(duì)列名進(jìn)行重命名,具體代碼如下所示。

scala > personDF.select(personDF("name").as("username"),
personDF("age")).show()
+--------+---+
|username|age|
+--------+---+
|zhangsan| 20|
|  lisi| 29|
| wangwu| 25|
| zhaoliu| 30|
| tianqi| 35|
|  jerry| 40|
+--------+---+

從返回結(jié)果看出,原name字段重命名為username字段。

filter():實(shí)現(xiàn)條件查詢,過(guò)濾出想要的結(jié)果。

下面演示過(guò)濾age大于等于25的數(shù)據(jù),具體代碼如下所示。

從上述返回結(jié)果可以看出,成功過(guò)濾出符合大于等于25歲的條件數(shù)據(jù)。

groupBy():對(duì)記錄進(jìn)行分組。

下面演示按年齡進(jìn)行分組并統(tǒng)計(jì)相同年齡的人數(shù),具體代碼如下所示。

scala > personDF.groupBy("age").count().show()
+---+-----+
|age|count|
+---+-----+
| 20|  1|
| 40|  1|
| 35|  1|
| 25|  1|
| 29|  1|
| 30|  1|
+---+-----+

從上述返回結(jié)果看出,groupBy()成功統(tǒng)計(jì)相同年齡的人數(shù)信息。

sort():對(duì)特定字段進(jìn)行排序操作。

下面演示按年齡降序排列,具體代碼如下所示。

scala > personDF.sort(personDF("age").desc).show()
+---+---------+---+
| id|  name |age|
+---+---------+---+
| 6|  jerry | 40|
| 5|  tianqi  | 35|
| 4| zhaoliu | 30|
| 2|  lisi  | 29|
| 3| wangwu  | 25|
| 1|zhangsan | 20|
+---+--------+---+

從上述返回結(jié)果看出,數(shù)據(jù)成功按照年齡降序排列。

2.SQL風(fēng)格操作

DataFrame的強(qiáng)大之處就是我們可以將它看作是一個(gè)關(guān)系型數(shù)據(jù)表,然后可以在程序中直接使用spark.sql()的方式執(zhí)行SQL查詢,結(jié)果將作為一個(gè)DataFrame返回。使用SQL風(fēng)格操作的前提是需要將DataFrame注冊(cè)成一個(gè)臨時(shí)表,代碼如下所示。

scala > personDF.registerTempTable("t_person")

下面通過(guò)多個(gè)示例,演示使用SQL風(fēng)格方式操作DataFrame。

(1) 查詢年齡最大的前兩名人的信息,具體執(zhí)行代碼如下所示。

scala > spark.sql("select * from t_person order by age desc limit 2").show()
+---+------+---+
| id| name|age|
+---+------+---+
| 6| jerry| 40|
| 5|tianqi| 35|
+---+------+---+

(2) 查詢年齡大于25的人的信息,具體代碼如下所示。

scala > spark.sql("select * from t_person where age > 25").show()
+---+-------+---+
| id|  name|age|
+---+-------+---+
| 2|  lisi| 29|
| 4|zhaoliu| 30|
| 5| tianqi| 35|
| 6| jerry| 40|
+---+-------+---+

DataFrame操作方式簡(jiǎn)單,并且功能強(qiáng)大,熟悉SQL語(yǔ)法的開(kāi)發(fā)者都能夠快速地掌握DataFrame的操作,本小節(jié)只講解了部分常用的操作方式,讀者可通過(guò)Spark官方文檔http://spark.apache.org/docs/latest/sql-programming-guide.html詳細(xì)學(xué)習(xí)DataFrame的操作方式。

猜你喜歡:

DataFrame是什么意思?與RDD相比有哪些優(yōu)點(diǎn)?

多種方法創(chuàng)建DataFrame【大數(shù)據(jù)技術(shù)文章】

怎樣操作Spark SQL性能調(diào)優(yōu)?

傳智教育大數(shù)據(jù)培訓(xùn)

0 分享到:
和我們?cè)诰€交談!