在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