当您了解SQL时,您是否应该真正学习DataFrames?

顺序查询语言(SQL)已经成为事实上的标准,用于在数据库表上运行各种查询已有数十年了,现在仍然如此。 一旦学习了ANSI SQL,就可以从任何符合ANSI SQL的供应商处查询RDBMS上的数据。 这是使用符合标准的系统的美妙之处。 所有供应商都努力遵守这些标准。 具有MySQL经验的程序员可以轻松地在Oracle或Microsoft SQL服务器上工作,学习曲线很小,这在大多数公司中通常是工作上的。

在数据科学/分析界,在Hive和Spark-SQL中工作时,了解SQL也会对您有所帮助。 尽管Hive查询在技术上被称为HQL(Hive查询语言),但它们与SQL非常相似。 在谈到Spark时,您可以使用Spark-SQL继续学习您的SQL知识,而又不会花太多时间。 因此,您无需重新设计工具,就可以毫无疑问地在数据分析中使用当今大多数开发人员已掌握的SQL。

但是,DataFrames变得越来越流行,并且背后有充分的理由。 数据分析师/科学家倾向于使用的常见DataFrames API是:

  • 基于Python的Pandas DataFrame
  • 数据
  • Spark数据框

这是流行的DataFrames API上的Google趋势

显然,Pandas DataFrame API处于领先地位。 尽管R DataFrame领先于Spark,但随着PySpark DataFrame API的重大改进和API增强使融合朝着更加统一的DataFrame API迈进,Spark DataFrame近年来正逐渐兴起。 尽管没有针对DataFrame API的ANSI标准,并且每个供应商都在独立创建其API,但供应商似乎仍遵循一些未编写的标准,这使您在了解另一个DataFrame API时就不那么困难。

那您真的应该学习DataFrame API吗? 答案是肯定的 ! 如果您的任务是获取有关数据的见解。 让我们推理一下:

传统的RDBMS设置对于小数据来说是致命的

与任何RDBMS一起工作的人都意识到,建立关系数据库和维护数据库服务器本身就是一项任务。 此外,在运行任何查询之前,您首先必须创建DDL语句,然后运行它们,然后只有您才能插入数据进行分析。 RDBMS系统作为单独的进程运行,并且在运行查询时,必须使用与RDBMS系统兼容的客户端进程来创建数据库,表,然后运行查询。

相比之下,在任何机器上设置Jupyter Notebook以使用Python-Pandas或R DataFrame都是非常简单的! 只需下载Anaconda,它附带了一套用于数据科学和分析的工具,您便已准备就绪。

如果您不想在笔记本电脑上设置系统,则也可以使用任何基于云的Jupyter笔记本电脑提供商。 便捷的免费云系统之一是Google提供的Colab:https://colab.research.google.com

Colab支持Python,目前不支持R。 如果您使用Colab,则无需下载任何软件,并且只需从任何位置或设备单击浏览器即可开始数据分析,只需将数据文件上传到云盒即可。 Colab提供12 GB RAM,非常适合可以放入此RAM的数据集。 该系统还可以很好地与Google云端硬盘集成,因此您可以将分析文件或数据文件上传到云端硬盘,还可以与他人协作进行分析工作。 没有客户端软件,没有服务器连接,也没有DDL只是数据分析/科学而已!

使用DataFrame API轻松导入所有格式的数据

数据有各种形式。 在csv,json,HTML等中包含数据是非常常见的。大多数DataFrame API都为您提供了简单的读取功能,可以导入大多数常用数据格式来创建DataFrame。

本文假定您已经了解SQL,并且标题带您了解什么是DataFrame。 因此,此处仅显示Pandas DataFrame的语句编写方式。 这是一个使用Pandas导入csv和json文件的示例。

import pandas as pd 
  titanic = pd.read_csv('https://storage.googleapis.com/mbcc/titanic.csv') 
 detroit_crime = pd.read_json("https://data.detroitmi.gov/resource/9i6z-cm98.json") 

同样的查询在SQL中更复杂

如果必须查找表中的总行数或查找表中存在多少空值或查找数字列的平均值,平均值,中位数,众数,标准差等摘要统计信息,则应使用多少个查询运行SQL吗? 借助DataFrame,您可以通过将直观的功能应用于数据框来实现对数据的大部分鸟瞰。 以下是在泰坦尼克号数据集上使用Pandas DataFrame的一些示例。

  titanic.describe() 
  titanic.info() 

使用SQL添加和删除列并不容易

在分析过程中,添加用于保存细分和摘要的列和/或删除不需要的列是常规功能。 在像熊猫这样的可变DataFrame上执行这些操作就像编写一条代码语句一样简单,但是对于SQL,您必须首先从DML语句开始,然后编写查询。

 # drop columns 'col1', 'col2', 'col3' 
df.drop(['col1','col2',"col3"] , axis=1 , inplace=True)
  df2 = pd.DataFrame({ 
'标记':[20,19,7,15],'年龄':[29,32,31,28],\
'sex':['F','M','F','F'],'name':['Jane','John',\
'Sally','Sandy'],'ssn':['1234','3456','4567','5678']
})
df2

输出量

  #在现有数据框中添加新列以存储百分比值 
df2 ['percent'] =(df ['marks'] / 20)* 100
  df2 

输出:

无法在SQL查询上应用Lambda函数

您不能在SQL语句中插入随机编程代码,但是任何DataFrame都可以。 您可以在任何查询之间混合和匹配任何代码/功能,并提供功能非常强大的API,可以做更多的事情。

 f = lambda x: x*3 
df.apply(f)
# all values of the dataframe will be multiplied by 3

SQL中的重复数据删除是一项复杂的操作!

您是否曾经受命在数据库表中查找重复记录? 您要做的查询如此复杂? 这是将所有重复记录删除到Pandas DataFrame中的查询。

 df.drop_duplicates(inplace=True) 

结论

请注意,上面显示的功能只是从头开始,DataFrames API确实非常强大,并且要解释其所有功能将花费整本书! 上面的示例适用于Pandas DataFrame。 尽管Spark DataFrames尚不如Pandas DataFrames强大,但与Spark-RDD相比,Spark DataFrames的优化程度更高,与Spark-SQL相比,Spark DataFrame的冗长程度也更低(如前所述)。

那么何时确切使用SQL? SQL最好留给事务性业务应用程序。 对于探索性数据分析(EDA)和数据分析/科学项目,DataFrame是最佳选择。 如果您更喜欢使用Python进行分析,则对于小型数据集,请使用Pandas DataFrame,对于大数据,请使用Spark DataFrame。