更新時(shí)間:2021年04月14日16時(shí)00分 來(lái)源:傳智教育 瀏覽次數(shù):
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)?
北京校區(qū)