使用spaklyr操作数据

使用spaklyr操作数据

dplyr 是一个 R 包,用于在 R 内部和外部处理结构化数据。dplyr 使 R 用户的数据操作变得简单、一致且高性能。

  • 选择、筛选和聚合数据
  • 使用窗口函数(例如,用于采样)
  • 在上执行联接DataFrames
  • 将数据从 Spark 收集到 R

dplyr 中的语句可以使用 magrittr R 包定义的管道链接在一起。dplyr 还支持对其参数进行非标准评估

 

航班数据

  使用 R 包中的数据演示 dplyr 的一些基本数据操作。此软件包包含 2013 年从纽约市出发的所有 336776 个航班的数据。它还包括有关航空公司、机场、天气和飞机的有用元数据。数据来自美国交通统计局,并记录在nycflights13?nycflights13

library(sparklyr)

library(dplyr)

library(ggplot2)

sc <- spark_connect(master="local")  #连接spark

 

flights_tbl <- copy_to(sc, nycflights13::flights, "flights")

 

airlines_tbl <- copy_to(sc, nycflights13::airlines, "airlines")

 

 

 

dplyr Verbs

谓词是用于操作数据的命令。连接到 Spark DataFrame 时,将命令转换为 Spark SQL 语句。远程数据源使用与本地数据源完全相同的五个谓词。以下是五个谓词及其相应的 SQL 命令。

select() ~ SELECT

filter() ~ WHERE

arrange() ~ ORDER

summarise() ~ aggregators: sum, min, sd, etc.

mutate() ~ operators: +, *, log, etc.

 

select(flights_tbl, year:day, arr_delay, dep_delay)

 

filter(flights_tbl, dep_delay > 1000)

 

arrange(flights_tbl, desc(dep_delay))

 

summarise(

  flights_tbl,

  mean_dep_delay = mean(dep_delay, na.rm = TRUE)

)

 

mutate(flights_tbl, speed = distance / air_time * 60)

 

Laziness

使用数据库时,尝试尽可能懒惰,它永远不会将数据拉入 R,除非你明确要求它。它会将任何工作的延迟到最后一刻:它将您要执行的所有操作收集在一起,然后一步将其发送到数据库。

例如,采用以下代码:

c1 <- filter( flights_tbl, day == 17, month == 5, carrier %in% c('UA', 'WN', 'AA', 'DL') )

c2 <- select(c1, year, month, day, carrier, dep_delay, air_time, distance)

c3 <- mutate(c2, air_time_hours = air_time / 60)

c4 <- arrange(c3, year, month, day, carrier)

此操作序列实际上从未触及数据库。直到您请求数据(例如通过打印),dplyr才会从数据库中请求结果。

c4

 

管道

可以使用 magrittr 管道来编写更简洁的语法,使用上面相同的示例,您可以编写一个更干净的版本,如下所示:

c4 <- flights_tbl %>% 

  filter(month == 5, day == 17, carrier %in% c('UA', 'WN', 'AA', 'DL')) %>% 

  select(carrier, dep_delay, air_time, distance) %>% 

  mutate(air_time_hours = air_time / 60) %>% 

  arrange(carrier) 

 

Grouping 分组

该函数对应于 SQL 中的语句。group_by()

flights_tbl %>% 

group_by(carrier) %>% 

summarize( count = n(), mean_dep_delay = mean(dep_delay, na.rm = FALSE) )

 

Collecting to R  (复制到R)

可以使用collect(),将数据从 Spark 复制到 R 的内存中。

carrierhours <- collect(c4)

 

collect()执行 Spark 查询并将结果返回到 R 以进行进一步的分析和可视化。

with(carrierhours, pairwise.t.test(air_time, carrier))

 

carrierhours %>% 

  ggplot() + geom_boxplot(aes(carrier, air_time_hours))

 

SQL Translation( SOL翻译)

在对筛选、更改和汇总时通常使用的形式进行简单的数学运算时,将 R 代码转换为 SQL(或实际上转换为任何编程语言)相对简单。 

# Basic math operators  (基础数学操作)

   +, -, *, /, %%, ^

# Math functions  (数学函数)

   abs, acos, asin, asinh, atan, atan2, ceiling, cos, cosh, exp, floor, log, log10, round, sign, sin, sinh, sqrt, tan, tanh

# Logical comparisons  (逻辑比较)

   <, <=, !=, >=, >, ==, %in% # Boolean operations &, &&, |, ||, !

# Character functions  (字符函数)

   paste, tolower, toupper, nchar

# Casting

   as.double, as.integer, as.logical, as.character, as.date

# Basic aggregations  (基础聚合函数)

   mean, sum, min, max, sd, var, cor, cov, n

dplyr支持 Spark SQL 窗口函数。窗口函数与 mutate filter 结合使用,以解决各种问题。您可以将语法与它通过使用dplyr::show_query()生成的查询进行比较。

 #将每个航班排列在一天

ranked <- flights_tbl %>% 

  group_by(year, month, day) %>% 

  select(dep_delay) %>% 

  mutate(rank = rank(desc(dep_delay)))

  dplyr::show_query(ranked) 

 

ranked

 

Peforming Joins( 连接展示)

数据分析很少只涉及单个数据表。在实践中,您通常会有许多有助于分析的表,并且您需要灵活的工具来组合它们。在dplyr中,有三个动词族一次处理两个表:

可变联接,从一个表中的匹配行向另一个表中添加新变量。

筛选联接,根据一个表中的观测值是否与另一个表中的观测值匹配来筛选这些观测值。

设置操作,将数据集中的观测值组合在一起,就好像它们是设置的元素一样。

所有双表谓词的工作方式都类似。前两个参数是 and ,并提供要合并的表。输出始终是与x y x相同类型的新表。

flights_tbl %>% 

  left_join(airlines_tbl, by = "carrier") %>% 

  select(name, flight, dep_time)

 

Sampling( 采样)

可以使用sample_n() sample_frac() 并获取行的随机样本:用于固定数字和固定分数。

sample_n(flights_tbl, 10) %>% 

select(1:4) 

 

sample_frac(flights_tbl, 0.01) %>% 

count()

 

Hive Functions (Hive函数)

Hive的许多内置函数(UDF)和内置聚合函数(UDAF)都可以在dplyr的突变和汇总中调用。

#下面的示例使用 dateiff  hive 内置函数current_date来计算flight_date与当前系统日期之间的差异:

flights_tbl %>% 

  mutate( flight_date = paste(year,month,day,sep="-"), days_since = datediff(current_date(), flight_date) ) %>%

  group_by(flight_date,days_since) %>% 

  count() %>% 

  arrange(-days_since) 

 

spark_disconnect(sc)  #断开链接
posted @ 2022-04-15 14:37  zhang-X  阅读(139)  评论(0)    收藏  举报