现代R和/或Python库会使SQL过时吗?


14

我在办公室工作,其中SQL Server是我们所做的一切工作的骨干,从数据处理到清理再到处理。我的同事擅长编写复杂的功能和存储过程,以系统地处理传入的数据,以便可以对其进行标准化并将其用于报告,可视化和分析项目中。在这里开始之前,除了编写最基本的查询之外,我对SQL的了解很少。我的大部分分析准备工作都是在R中完成的。我的老板坚持说我提高了我的SQL技能,尽管似乎很少有分配工作无法更有效地完成,并且使用R编写的代码行少得多软件包,例如dplyr,data.table和tidyr(仅举几例)。我的问题是-这有意义吗?

几周前,我发现自己面临的任务是获取满足特定条件的表中每一行的列名列表,然后将它们连接成字符串向量。截止日期很紧,当时我遇到了一些障碍,无法完全解决这个问题。我问我的老板,后者又请我的同事编写脚本TSQL来解决问题。当他在研究它时,我想出了一种方法来用R编写一个相当简单的函数并将其应用于数据框。大约两个小时后,我的同事带着他的剧本回来了。至少有75行包含两个嵌套的for循环。我要求他告诉它何时完成运行,他说这需要几个小时。同时,我的R脚本能够在约30秒内循环遍历约45,000条记录。

我是否应该认为R是用于清理和处理数据的更好选择?也许我办公室里的SQL开发人员只是无能为力?我很好奇,是否同时使用R和SQL(或Python和SQL)的人对此有任何想法。


2
如果数据库足够小且静态,则可以将其加载到内存中,并使用首选的ETL工具,例如dplyr。当您在云中拥有大数据时,您的方法根本行不通。我会定期运行使BigQuery(Google)抱怨的查询。我直接用SQL编写查询,但如果需要,可以将Spark用作中间层在数据帧中进行操作。
Emre

1
那么就数据存储方式而言,SQL固有地比R本质上更有效吗?还是SQL服务器倾向于具有更多的内置内存和处理能力?
AffableAmbler '17

1
您不能发表笼统的声明-它取决于实现-但是好的数据库具有查询优化器,其中一些(例如BigQuery)支持多核执行。也许您想要的是在数据库之上的数据框或ORM抽象,以避免使用SQL。看来dplyr已经做到了这一点(请参见SQL翻译)。您可以针对原始SQL在dplyr中对同一查询进行基准测试以找出答案。有些人要做的是从少量数据样本中提取原型,然后淘汰大数据工具进行生产
Emre

3
您可以在SQL Server内简单地运行R并获得两全其美
Gaius

Answers:


13

R和SQL是两个完全不同的野兽。SQL是您可以用来查询已经存储在数据库中的数据的语言。SQL与R相比的优势主要在于数据库服务器(MS SQL,Oracle,PostgreSQL,MySQL等)的事实。

大多数(如果不是全部)现代数据库服务器允许多个用户从同一数据源查询数据,并在同一表中插入,更新和删除数据,同时确保数据保持一致。这对于说记录银行交易至关重要。您能想象在R上开设银行吗?这就是数据库服务器的用武之地。它们确保过程的ACID属性在数据库上运行。ACID代表原子性,并发性,隔离性和持久性(请参阅Wikipedia上的ACID描述)。R是一个单用户平台,所有内容都在内存中进行。因此,如果计算机在进行较大的操作时中途停止工作,则不会存储您的数据。您也是唯一可以访问数据的人。需要明确的是,R不是数据库服务器和/或SQL的替代方案。

数据库服务器的另一个主要优点是,良好的数据库设计将确保您可以通过执行查询优化来快速查询数据库。为了实现此目的,数据库服务器要跟踪表的设计。有关该主题的完整讨论,请参见Wiki页面。R无法执行查询优化。数据库设计不佳会导致查询执行缓慢。如果在数据库设计中正确使用了外键,则数据库服务器还可以对查询多个表的查询执行优化。

SQL语言的语法非常不同,我分享您的经验,即使用数据表或dplyr语法编写数据处理步骤要短一些。但是,有时您的数据对于R来说太大,或者您需要将结果存储在数据库中作为定期批处理作业的一部分,这将需要用SQL编写逻辑代码。

以我的经验,SQL和R / Python有一些特殊的用例。SQL非常适合存储关键业务数据,并允许多个人在集中式环境中访问,修改,插入和删除数据。对于任何一次性数据而言,R和Python都很棒。如果需要定期执行数据清除,则需要将R / Python脚本移植到SQL。


3

真的,这些甚至都没有可比性。SQL是用于访问数据的语言,R是用于处理数据的语言。

SQL并不是消除问题的有效工具,因为它很难看到中间步骤,并且当抛出错误时,它不太可能解决数据的形式/质量/结构。

我的工作流程通常是:

  1. 从SQL查询获取原始数据(在R中)
  2. 建立打磨常规
  3. 如果可能,请重写SQL查询以完成我在R中完成的调试

还应认识到,并非所有数据使用者都使用R,但是许多使用者仍然使用SQL将其选择的平台与数据接口。


1
我遵循的过程与此相同(非常不喜欢我的主管)。我同意,使用R.这样的语言执行复杂的调教任务(如我上面描述的任务)似乎要高效得多(感谢确认)。但是,如果SQL的唯一目的是成为数据的巨大硬盘驱动器,为什么不仅仅拥有R服务器呢?似乎所有功能(映射,设置链接表的键,分组和联接数据)现在都可以在R中非常有效地完成。就内存使用而言,SQL表是否比R数据帧更有效?
AffableAmbler '17

1
@Noah,因为并非所有人都使用
R。– HEITZ

2

library(dbplyr)具有正确的方法:用R编写所有内容(使用tidyverse),并使该库及时将R代码“编译”为低级SQL。

由于并非所有信息均可翻译,因此另一种方法是SQL Server采取的方法:让R代码段从SQL“选择”命令中调用。


1

以我的经验,HEITZ提到的1.,2、3方法可以扩展为3.的替代方法,在该方法中,您将数据从R(data.table)写回到MySQL。

所以完整的步骤是MySQL-> data.table-> MySQL

如果确保使用data.table语法,则不将DT复制到RAM友好的位置。


1

一句话NO。 当在适当的解释器层上放置SQL时,SQL是描述和汇总结构化的半结构化数据甚至是非结构化数据的一种强大而简洁的方法。顺便说sql一下,对于数据科学家来说,这几乎是必须具备的。

SQL 是执行以下核心操作的简洁而强大的方法:

  • 投影(选择 ..)
  • 过滤(其中 ..)
  • 分组/过滤(分组具有
  • 基本汇总(计数总和平均 ..)
  • 加入

使用内联视图合并结果时,才有真正的力量。当我需要做的,我会用一sqldfpandasqlpysparkSql/ sparkSql或直接连接RDBMS。以最简洁的方式可能与书同data.table(不过如此data.frame)或datatable(优于pandas)仍然比较笨重,很多更笨重或几乎不可能取决于查询的复杂尝试。

对于数据处理:这是另一回事:有些操作很容易用sql表达,而有些则不那么多。但是,当您合并UDFs时,可以实现的范围更广。我当前的任务包括许多操作,UDF例如客户交叉口操作,自定义聚合和自定义评分方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.