前言
9102年是互联网大环境不太好的一年,这一年更需要苦练基本功,数据科学领域的基本功无非就是数据处理,而 DataFrame 是其中的核心。那么,都9102年了,如何在 R 语言中优雅地使用 DataFrame 呢?是否优雅是矿工生产力差异的重要来源,本文将介绍最近三年来 DataFrame 的最近进展。
R 中的 DataFrame 新趋势
tidy 编程流
分布式计算
集成 NoSQL
集成各领域核心算法
按照功能来划分:
核心计算:tidyverse/sparklyr
空间计算:sf/geospark/tidyraster
文本计算:tidytext/tabulizer
深度学习:keras
核心计算
tidyverse 介绍
谈到数据处理的基本功必须先了解 DataFrame 的最核心能力:比SQL还要优雅地处理数据。作为第四代数据处理语言的核心 tidyverse 是必须要了解的。
tidyverse 实现了核心计算的大一统,它囊括了八个数据科学最高频的操作:
ggplot2, 支持数据可视化
dplyr, 数据操作
tidyr, 数据清洗
readr, 数据IO
purrr, 函数式编程
tibble, 数据框轻量化格式
stringr, 文本处理
forcats, 因子类型处理
对于 tidyverse 的各个子模块可以参考 R语言与DataFrame 2016版, 其中详细介绍了各模块的情况,本文不再赘述,更多着墨与新趋势。八大模块中,dplyr 是核心中的核心,因为它实现了数据处理的前后端分离,支持 R 语言的前端和多种结构化数据库的后端,比如 RPostGIS,RMySQL,sparklyr 等。
Spark 数据处理举例
下面举一个 sparklyr 处理 iris 数据的例子来感受一下现代数据处理:
步骤一:数据库连接
library(sparklyr)
library(tidyverse)
# 分布式OLAP数据库 Hive 连接
sc
spark_home = "/data/FinanceR/Spark",
version = "2.2.0",
config = sparklyr::spark_config())
# 或者分布式OLTP数据库 tidb 连接
# sc
# user="FinanceR", password="FinanceR",
# dbname="FinanceR", host="192.168.1.100")
# 或者基于内存索引的 MPP数据库 impala 链接
# impala
# drv = odbc::odbc(),
# driver = "Cloudera ODBC Driver for Impala",
# host = "host",
# port = 21050,
# database = "default",
# uid = "username",
# pwd = "password"
# )
步骤二:数据操作
# 在 mutate 中支持 Hive UDF
remote_df = copy_to(sc,iris,"iris_tbl")
remote_df = dplyr::tbl(sc,from = "db.iris_tbl") # 定义数据源表
# 或者 remote_df = dplyr::tbl(sc,from = dplyr::sql("select * from db.iris_tbl limit 10")) #
# 以比SQL更接近于自然语言的方法编程,以基本的 过滤、聚合、排序为例
remote_df %>%
dplyr::mutate(a = Sepal_Length+2) %>% # 在 mutate 中支持 Hive UDF
dplyr::filter(a > 2)%>%
dplyr::group_by(Species)%>%
dplyr::summarize(count = n())%>%
dplyr::select(cnt = count)%>%
dplyr::arrange(desc(cnt)) %>%
dplyr::mutate_if(is.double,as.character) -> # 配合 逆天的批量操作
pipeline
步骤三:检验语法
## 一顿操作猛如虎之后,将数据操作的对应SQL执行过程打印出来
pipeline %>%
dbplyr::sql_render()
# SELECT CAST(`cnt` AS STRING) AS `cnt`
FROM (SELECT *
FROM (SELECT `count` AS `cnt`
FROM (SELECT `Species`, count(*) AS `count`
FROM (SELECT *
FROM (SELECT `Sepal_Length`, `Sepal_Width`, `Petal_Length`, `Petal_Width`, `Species`, `Sepal_Length` + 2.0 AS `a`
FROM `iris_tbl`) `nmpfznbuzf`
WHERE (`a` > 2.0)) `ygjaktrzzu`
GROUP BY `Species`) `lbmpsjksox`) `tdrwlnidxw`
ORDER BY `cnt` DESC) `mzuwuocxay`
步骤四:数据存储
## 将 pipeline 结果自动缓存为临时表 tmp_tbl
tmp_tbl = pipeline %>% compute("tmp_tbl")
# 将 临时表按照条件过滤后再写回 Hive 数据库,省去建表过程
tmp_tbl %>%
filter(cnt > 10) %>%
sparklyr::spark_write_table("db.financer_res")
通过上面的例子,我们可以看到使用 sparklyr 而不是直接使用 Hive ,能够使得数据分析流程变得更加高效和方便。
空间计算
在 Edzer 等人的努力之下,空间计算社区逐渐建立起来一套优雅的以 sf 为核心的空间计算工作流。
核心组成主要包括
sf:矢量空间核心计算框架,实现九交模型、Voronoi图、凸包计算、GROUP BY、数据IO等标准操作。
stars:栅格空间核心计算框架,实现了核心multi-dimension的数据结构和数据IO,使得卫星影像时序数据处理更加高效。
rpostgisLT:基于PostGIS的轨迹数据分析工具
leaflet:轻量级的空间可视化组件
mapview:基于leaflet的高级空间可视化集成方案</