真正的第一个问题是为什么人们使用 DataFrame 抽象比纯 SQL 抽象更有效率。
TLDR;SQL 不适合(人类)开发和调试过程,DataFrames 是。
主要原因是 DataFrame 抽象允许您构造 SQL 语句,同时避免冗长和难以辨认的嵌套。编写嵌套例程,将它们注释掉以检查它们,然后取消注释它们的模式被单行转换所取代。您可以自然地在 repl 中逐行运行(甚至在 Spark 中)并查看结果。
考虑这个例子,将一个新的转换(字符串损坏的列)添加到一个表中,然后按它进行分组并进行一些聚合。SQL 变得非常丑陋。Pandas 可以解决这个问题,但在涉及真正的大数据或特定分区时缺少一些东西(也许最近有所改进)。
DataFrames 应该被视为 SQL 例程的高级 API,即使使用 pandas,它们根本不会呈现给某些 SQL 规划器。
您可能可以围绕此进行许多技术讨论,但我正在考虑下面的用户视角。
您可能会看到更多关于 Pandas 数据操作而不是 SQL 的问题的一个简单原因是,根据定义,使用 SQL 意味着使用数据库,而如今的许多用例非常简单地需要一些数据一次性完成的任务(来自 .csv、web api 等)。在这些情况下,从数据库中加载、存储、操作和提取是不可行的。
但是,考虑到用例可能证明使用 Pandas 或 SQL 的情况,您肯定没有错。如果您想做许多重复的数据操作任务并保留输出,我总是建议您先尝试通过 SQL。从我所见,即使在这些情况下,许多用户也不使用 SQL 的原因有两个。
首先,pandas 相对于 SQL 的主要优势在于它是更广泛的 Python 世界的一部分,这意味着我可以一举加载、清理、操作和可视化我的数据(我什至可以通过 Pandas 执行 SQL……)。另一个很简单,就是太多的用户不知道 SQL 的能力范围。每个初学者都学习 SQL 的“提取语法”(SELECT、FROM、WHERE 等),作为将数据从数据库中获取到下一个位置的一种手段。有些人可能会选择一些更高级的分组和迭代语法。但在那之后,知识往往会出现相当大的鸿沟,直到你接触到专家(DBA、数据工程师等)。
tl;dr:这通常取决于用例、便利性或围绕 SQL 功能范围的知识差距。