在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