在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。這個文件,上傳到你的空間:
去books.jsonGitHub上的文件,並使用一個文本編輯器將其內容複製到一個文件命名
books.json
在本地機器上的某個地方。在磚工作區數據科學與工程或機器學習視圖中,單擊數據在側邊欄。
點擊創建表。
在上傳文件選項卡,將
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=“性格”,語言=“性格”,鏈接=“性格”,頁麵=“整數”,標題=“性格”,一年=“整數”))
打印DataFrame的前幾行
您可以使用SparkR:頭
,SparkR:顯示
,或sparklyr::收集
打印DataFrame的第一行。默認情況下,頭
默認打印出前六行。顯示
和收集
打印前十行。例如,下麵的代碼運行在筆記本電池印刷的第一行DataFrame命名jsonDF
:
頭(jsonDF)#來源:火花< ?> [? ?x 8]#作者國家形象…¹並…²鏈接頁麵標題# <空空的> <空空的> <科> <空空的> <空空的> < int > <空空的> < int ># 1 Chinua Achebe尼日利亞圖片…英語”計畫…209瘦…1958# 2漢斯·克裏斯蒂安·安徒生丹麥丹麥“計畫圖片……784…1836# 3但丁意大利圖片…意大利“計畫…928…1315# 4未知蘇美爾和樣子…圖片…Akkadi http…160…-1700…”# 5未知阿Em…圖片…希伯來語“計畫…176…-600# 6未知印度/伊朗/ Ir…圖片…阿拉伯語“http…288…1200#…用縮寫變量名¹imageLink,²語言顯示(jsonDF)#來源:火花< jsonTable > [? ?x 8]#作者國家形象…¹並…²鏈接頁麵標題# <空空的> <空空的> <科> <空空的> <空空的> < int > <空空的> < int ># 1 Chinua Achebe尼日利亞圖片…英語”計畫…209瘦…1958# 2漢斯·克裏斯蒂安·安徒生丹麥丹麥“計畫圖片……784…1836# 3但丁意大利圖片…意大利“計畫…928…1315# 4未知蘇美爾和Ak…圖片…Akkadi http…160…-1700…”# 5未知阿E…圖片…希伯來語“計畫…176…-600# 6未知印度/伊朗/我…圖片…阿拉伯語“http…288…1200# 7未知冰島圖片…老…”計畫…384年Njal…1350# 8簡·奧斯汀聯合Kingd…圖片…英語”計畫…226年Prid…1813# 9巴爾紮克法國圖片…”計畫…443 P…1835法國# 10塞繆爾·貝克特共和國…圖片……”計畫…256摩爾…1952#…更多的行,和縮寫變量名稱¹imageLink,²語言#ℹ使用“打印(n =…)”來看到更多的行收集(jsonDF)#一個寵物貓:100×8#作者國家形象…¹並…²鏈接頁麵標題# <空空的> <空空的> <科> <空空的> <空空的> < int > <空空的> < int ># 1 Chinua Achebe尼日利亞圖片…英語”計畫…209瘦…1958# 2漢斯·克裏斯蒂安·安徒生丹麥丹麥“計畫圖片……784…1836# 3但丁意大利圖片…意大利“計畫…928…1315# 4未知蘇美爾和Ak…圖片…Akkadi http…160…-1700…”# 5未知阿E…圖片…希伯來語“計畫…176…-600# 6未知印度/伊朗/我…圖片…阿拉伯語“http…288…1200# 7未知冰島圖片…老…”計畫…384年Njal…1350# 8簡·奧斯汀聯合Kingd…圖片…英語”計畫…226年Prid…1813# 9巴爾紮克法國圖片…”計畫…443 P…1835法國# 10塞繆爾·貝克特共和國…圖片……”計畫…256摩爾…1952#…90多行,縮寫為變量名¹imageLink,²語言#ℹ使用“打印(n =…)”來看到更多的行
運行SQL查詢,從表寫和讀
您可以使用dplyr DataFrame函數運行SQL查詢。例如,下麵的代碼運行在筆記本電池使用dplyr: group_by
和dployr:數
計數,作者從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命名jsonDF
DataFrame然後使用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默認前十行。
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:變異
添加兩個列的內容withDate
DataFrame。新月
和一年
列包含的數字月和年今天
列。然後編寫這些內容到一個新的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:變異
添加兩個列的內容withMMyyyy
DataFrame。新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_approx
25日,計算彙總統計的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