在R DataFrames和表工作

本文描述了如何使用R包等SparkR,sparklyr,dplyr使用Rdata.frame年代,火花DataFrames,內存中的表。

sparklyr,注意,當你使用SparkR dplyr,你可能會發現,您可以完成特定的操作與所有這些包,你可以使用你最舒適的包。例如,運行一個查詢,您可以調用等功能SparkR: sql,sparklyr: sdf_sql,dplyr:選擇。在其他時候,你可能會完成一個操作隻有一個或兩個這樣的包,和您選擇的操作取決於您的使用場景。例如,你的電話sparklyr: sdf_quantile你打電話的方式略有不同dplyr: percentile_approx,雖然兩個函數calcuate分位數。

您可以使用SQL SparkR和sparklyr之間的橋梁。例如,您可以使用SparkR: sql與sparklyr查詢創建的表。您可以使用sparklyr: sdf_sql與SparkR查詢創建的表。和dplyr之前總是翻譯成SQL代碼在內存中運行。另請參閱API的互操作性SQL翻譯

負載SparkR sparklyr, dplyr

SparkR, sparklyr和dplyr包中包括磚磚上安裝的運行時集群。因此,您不需要調用install.package之前你可以叫這些包。然而,你仍然必須加載這些包圖書館第一。例如,在一個R筆記本磚的工作區,在筆記本電腦中運行以下代碼細胞加載SparkR sparklyr, dplyr:

圖書館(SparkR)圖書館(sparklyr)圖書館(dplyr)

sparklyr連接到一個集群

在負載sparklyr之後,您必須調用sparklyr: spark_connect連接到集群中,指定連接方法。例如,下麵的代碼運行在筆記本電池連接到集群主機筆記本:

sc< -spark_connect(方法=“磚”)

相比之下,一個磚筆記本已經建立SparkSession與SparkR在集群上使用,所以您不需要調用SparkR: sparkR.session你可以叫SparkR之前。

上傳一個JSON數據文件到您的工作空間中

許多本文中的代碼示例是基於數據在一個特定的位置在你的磚工作區,與特定的列名稱和數據類型。這段代碼示例的數據來源於一個JSON文件命名book.json在GitHub。這個文件,上傳到你的空間:

  1. books.jsonGitHub上的文件,並使用一個文本編輯器將其內容複製到一個文件命名books.json在本地機器上的某個地方。

  2. 在磚工作區數據科學與工程機器學習視圖中,單擊數據在側邊欄。

  3. 點擊創建表

  4. 上傳文件選項卡,將books.json文件從本地機器將文件上傳盒子。或選擇點擊瀏覽,瀏覽到books.json文件從您的本地機器上。

默認情況下,磚上傳你的地方books.json文件到DBFS位置在您的工作區路徑/ FileStore /表/ books.json

不點擊用UI創建表在筆記本上創建表。本文中的代碼示例使用數據上傳books.json文件在這個DBFS位置。

JSON數據讀入DataFrame

使用sparklyr: spark_read_json上傳的JSON文件讀入DataFrame,指定連接,JSON文件的路徑和名稱的內部表表示的數據。對於本例,您必須指定的book.json文件包含多個行。指定列的模式是可選的。否則,sparklyr推斷列的默認模式。例如,下麵的代碼運行在一個筆記本電池JSON文件上傳的數據讀入DataFrame命名jsonDF:

jsonDF< -spark_read_json(sc=sc,的名字=“jsonTable”,路徑=“/ FileStore /表/ books.json”,選項=列表(“多行”=真正的),=c(作者=“性格”,國家=“性格”,imageLink=“性格”,語言=“性格”,鏈接=“性格”,頁麵=“整數”,標題=“性格”,一年=“整數”))

運行SQL查詢,從表寫和讀

您可以使用dplyr DataFrame函數運行SQL查詢。例如,下麵的代碼運行在筆記本電池使用dplyr: group_bydployr:數計數,作者從DataFrame命名jsonDF。使用dplyr:安排dplyr: desc在由計數降序排序結果。然後打印默認前十行。

group_by(jsonDF,作者)% > %()% > %安排(desc(n))#來源:火花< ?> [? ?x 2]#下令:desc (n)#作者n# <空空的> <雙># 1陀思妥耶夫斯基4# 2未知4# 3列夫·托爾斯泰# 4卡夫卡3# 5威廉·莎士比亞3# 6威廉·福克納2# 7古斯塔夫·福樓拜2# 8荷馬2# 9馬爾克斯2# 10托馬斯·曼2#…更多的行#ℹ使用“打印(n =…)”來看到更多的行

然後您可以使用sparklyr: spark_write_table在磚寫結果表。例如,下麵的代碼運行在筆記本電池重新運行查詢,然後將結果寫入一個表命名json_books_agg:

group_by(jsonDF,作者)% > %()% > %安排(desc(n))% > %spark_write_table(的名字=“json_books_agg”,模式=“覆蓋”)

創建驗證表,你就可以使用sparklyr: sdf_sql隨著SparkR: showDF顯示表的數據。例如,下麵的代碼運行在筆記本電池表查詢DataFrame然後使用sparklyr::收集打印的第十行DataFrame默認情況下:

收集(sdf_sql(sc,“從json_books_agg SELECT *”))#一個寵物貓:82×2#作者n# <空空的> <雙># 1陀思妥耶夫斯基4# 2未知4# 3列夫·托爾斯泰# 4卡夫卡3# 5威廉·莎士比亞3# 6威廉·福克納2# 7荷馬2# 8古斯塔夫·福樓拜2# 9馬爾克斯2# 10托馬斯·曼2#…72多行#ℹ使用“打印(n =…)”來看到更多的行

您還可以使用sparklyr: spark_read_table做類似的事情。例如,在筆記本電池運行下麵的代碼查詢前DataFrame命名jsonDFDataFrame然後使用sparklyr::收集打印的第十行DataFrame默認情況下:

fromTable< -spark_read_table(sc=sc,的名字=“json_books_agg”)收集(fromTable)#一個寵物貓:82×2#作者n# <空空的> <雙># 1陀思妥耶夫斯基4# 2未知4# 3列夫·托爾斯泰# 4卡夫卡3# 5威廉·莎士比亞3# 6威廉·福克納2# 7荷馬2# 8古斯塔夫·福樓拜2# 9馬爾克斯2# 10托馬斯·曼2#…72多行#ℹ使用“打印(n =…)”來看到更多的行

DataFrame添加列和計算列值

您可以使用dplyr函數將列添加到DataFrames和計算列的值。

例如,下麵的代碼運行在筆記本電池DataFrame命名的內容jsonDF。使用dplyr:變異添加一個列命名今天與當前時間戳,填補這一新的列。然後編寫這些內容到一個新的DataFrame命名withDate和使用dplyr::收集打印新DataFrame默認前十行。

請注意

dplyr:變異隻接受參數符合蜂巢的內置函數(也稱為udf)和內置的聚合函數(也稱為UDAFs)。一般信息,請參閱蜂巢的功能。日期相關的信息的功能在本節中,看到的日期函數

withDate< -jsonDF% > %變異(今天=current_timestamp())收集(withDate)#一個寵物貓:100×9#作者國家形象…¹並…今天²鏈接頁麵標題的一年# <空空的> <空空的> <科> <空空的> <空空的> < int > <空空的> < int > < dttm ># 1 Chinua…尼日利亞圖片…英語”計畫209瘦…1958…2022-09-27 21:32:59# 2漢斯科……丹麥丹麥圖像”計畫…784…1836 2022-09-27 21:32:59# 3但丁意大利半島…圖片意大利“http…928…1315…2022-09-27 21:32:59# 4未知蘇美爾…圖片…Akkadi…”計畫160 -1700 2022-09-27 21:32:59……# 5未知Achaem…圖片…希伯來語“計176 -600 2022-09-27 21:32:59……# 6未知印度/…圖片…阿拉伯語”計畫…288…1200 2022-09-27 21:32:59# 7未知冰島圖片…老…”計畫…384年Njal…1350 2022-09-27 21:32:59# 8簡來自美國……圖片…英語”計畫…226年Prid…1813 2022-09-27 21:32:59# 9歐諾瑞d…法國圖片…”計畫…443 Le P…1835 2022-09-27 21:32:59# 10撒母耳B…Republ…圖片…法國…”計畫256摩爾…1952…2022-09-27 21:32:59#…90多行,縮寫為變量名¹imageLink,²語言#ℹ使用“打印(n =…)”來看到更多的行

現在使用dplyr:變異添加兩個列的內容withDateDataFrame。新一年列包含的數字月和年今天列。然後編寫這些內容到一個新的DataFrame命名withMMyyyy,並使用dplyr:選擇隨著dplyr::收集打印的作者,標題,一年列新DataFrame的前十行默認情況下:

withMMyyyy< -withDate% > %變異(=(今天),一年=一年(今天))收集(選擇(withMMyyyy,c(“作者”,“標題”,“月”,“年”)))#一個寵物貓:100×4#標題作者月# <空空的> <空空的> < int > < int ># 1 Chinua Achebe 9 2022年分裂的東西# 2漢斯·克裏斯蒂安·安徒生童話2022 99 # 3但丁《神曲》20222022 # 4未知的吉爾伽美什史詩》的92022年9 # 5未知的工作2022 # 6未知一千零一晚上92022 # 7未知Njal傳奇99 # 8簡·奧斯丁《傲慢與偏見》2022# 9巴爾紮克高老頭2022 9# 10塞繆爾·貝克特莫雷,馬龍死了,難以形容的,…2022 9#…90多行#ℹ使用“打印(n =…)”來看到更多的行

現在使用dplyr:變異添加兩個列的內容withMMyyyyDataFrame。新formatted_date列包含了yyyy-MM-dd部分的今天列,而新一天從新的列包含數字的一天formatted_date列。然後編寫這些內容到一個新的DataFrame命名withUnixTimestamp,並使用dplyr:選擇隨著dplyr::收集打印的標題,formatted_date,一天列新DataFrame的前十行默認情況下:

withUnixTimestamp< -withMMyyyy% > %變異(formatted_date=date_format(今天,“yyyy-MM-dd”),一天=dayofmonth(formatted_date))收集(選擇(withUnixTimestamp,c(“標題”,“formatted_date”,“天”)))#一個寵物貓:100×3#標題formatted_date天# <空空的> <空空的> < int ># 1東西瓦解2022-09-27 27# 2童話2022-09-27 27# 3《神曲》2022-09-27 27# 4《吉爾伽美什史詩》的2022-09-27 272022-09-27 27 # 5的工作# 6一千零一夜2022-09-27 27# 7 Njal的傳奇2022-09-27 27# 8《傲慢與偏見》2022-09-27 27# 9高老頭2022-09-27 27# 10莫雷,馬龍死了,難以形容的,三部曲2022-09-27 27#…90多行#ℹ使用“打印(n =…)”來看到更多的行

創建一個臨時視圖

您可以創建名為臨時視圖基於現有DataFrames在內存中。例如,下麵的代碼運行在筆記本電池使用SparkR: createOrReplaceTempView前DataFrame命名的內容jsonTable和做一個臨時的命名視圖timestampTable。然後,用sparklyr: spark_read_table讀取臨時視圖的內容。使用sparklyr::收集打印的第十行默認臨時表:

createOrReplaceTempView(withTimestampDF,viewName=“timestampTable”)spark_read_table(sc=sc,的名字=“timestampTable”)% > %收集()#一個寵物貓:100×10#作者國家形象…¹並…今天²鏈接頁麵標題的一年# <空空的> <空空的> <科> <空空的> <空空的> < int > <空空的> < int > < dttm ># 1 Chinua…尼日利亞圖片…英語”計畫209瘦…1958…2022-09-27 21:11:56# 2漢斯科……丹麥丹麥圖像”計畫…784…1836 2022-09-27 21:11:56# 3但丁意大利半島…圖片意大利“http…928…1315…2022-09-27 21:11:56# 4未知蘇美爾…圖片…Akkadi…”計畫160 -1700 2022-09-27 21:11:56……# 5未知Achaem…圖片…希伯來語“計176 -600 2022-09-27 21:11:56……# 6未知印度/…圖片…阿拉伯語”計畫…288…1200 2022-09-27 21:11:56# 7未知冰島圖片…老…”計畫…384年Njal…1350 2022-09-27 21:11:56# 8簡來自美國……圖片…英語”計畫…226年Prid…1813 2022-09-27 21:11:56# 9歐諾瑞d…法國圖片…”計畫…443 Le P…1835 2022-09-27 21:11:56# 10撒母耳B…Republ…圖片…法國…”計畫256摩爾…1952…2022-09-27 21:11:5690多行,1 #…更多的變量:月<科>,和縮寫變量#姓名¹imageLink²語言#ℹ使用“打印(n =…)”來看到更多的行,和“colnames()的所有變量名

DataFrame執行統計分析

您可以使用sparklyr連同dplyr統計分析。

例如,創建一個DataFrame運行統計數據。要做到這一點,在筆記本電池運行下麵的代碼使用sparklyr: sdf_copy_to寫的內容虹膜數據集構建成R DataFrame命名虹膜。使用sparklyr: sdf_collect打印的第十行默認臨時表:

irisDF< -sdf_copy_to(sc=sc,x=虹膜,的名字=“愛麗絲”,覆蓋=真正的)sdf_collect(irisDF,一點“行操作”)#一個寵物貓:150×5# Sepal_Length Sepal_Width Petal_Length Petal_Width物種# <雙> <雙> <雙> <雙> <空空的># 1 5.1 3.5 1.4 0.2 setosa# 2 4.9 - 3 1.4 - 0.2 setosa# 3 4.7 3.2 1.3 0.2 setosa# 4 4.6 3.1 1.5 0.2 setosa# 5 5 3.6 1.4 0.2 setosa# 6 5.4 3.9 1.7 0.4 setosa# 7 4.6 3.4 1.4 0.3 setosa5 # 8 3.4 1.5 0.2 setosa# 9 4.4 2.9 1.4 0.2 setosa# 10 4.9 3.1 1.5 0.1 setosa#…140多行#ℹ使用“打印(n =…)”來看到更多的行

現在使用dplyr: group_by集團的行物種列。使用dplyr:總結隨著dplyr: percentile_approx25日,計算彙總統計的50、75、100分位數Sepal_Length列的物種。使用sparklyr::收集打印結果:

請注意

dplyr:總結隻接受參數符合蜂巢的內置函數(也稱為udf)和內置的聚合函數(也稱為UDAFs)。一般信息,請參閱蜂巢的功能。和有關信息。percentile_approx,請參閱內置的聚合函數(UDAF))。

quantileDF< -irisDF% > %group_by(物種)% > %總結(quantile_25th=percentile_approx(Sepal_Length,0.25),quantile_50th=percentile_approx(Sepal_Length,0.50),quantile_75th=percentile_approx(Sepal_Length,0.75),quantile_100th=percentile_approx(Sepal_Length,1.0))收集(quantileDF)#一個寵物貓:3×5#物種quantile_25th quantile_50th quantile_75th quantile_100th# <空空的> <雙> <雙> <雙> <雙># 1 virginica 6.2 6.5 6.9 7.9# 2雜色的5.6 5.9 6.3 75 # 3 setosa 4.8 5.2 5.8

類似的結果可以計算,例如,通過使用sparklyr: sdf_quantile:

打印(sdf_quantile(x=irisDF% > %過濾器(物種= =“virginica”),=“Sepal_Length”,概率=c(0.25,0.5,0.75,1.0)))# 25% 50% 75% 100%# 6.2 6.5 6.9 7.9