【问题标题】:Can Python or R join local dataframes with database tables like Proc SQL in SAS?Python 或 R 可以将本地数据帧与 SAS 中的 Proc SQL 等数据库表连接起来吗?
【发布时间】:2020-02-24 17:17:13
【问题描述】:

PROC SQL 可以将本地表连接到数据库中的一个。例如,加入 db.sales 和 work.customer_info。据我所知,R 或 Python 中没有任何包可以做到这一点。要么必须将本地表上传到数据库并在那里完成连接,要么必须将表(整个或子集)作为数据帧查询到本地内存中,然后与平面文件连接。

真的有办法在 Python 或 R 中做到这一点吗?还是 SAS 更适合这样的查询?

【问题讨论】:

  • 您认为 SAS 如何将内存中的本地表与数据库上的远程表连接起来?我怀疑这项工作是在您本地环境的内存中完成的。如果这是真的,那么 R 和 Python 中存在类似的工具。
  • 不要高估 SAS 的 PROC SQL。它基本上是一个生成 DATA 步的代码生成器。由于缺少任何有用的目录(索引、外键等),它只能用于琐碎的 SQL 操作。三个或四个表 - 连接或反连接性能不会很好。

标签: python sql r sas


【解决方案1】:

一般来说,没有客户端(这里是 Python Pandas、R 和 SAS)实际上将服务器存储的数据库表加入到客户端对象,如数据帧或数据集。客户端处理与后端系统的远程连接,然后导入结果集以供其他本地使用。具体来说:

  • Python Pandas 和 R 中的数据帧在 RAM 中运行,您可以在 RAM 中加入/合并/追加来自平面文件或其他结构的当前全局环境中的任何数据帧。 Python 和 R 还可以连接到关系数据库,并在当前会话的全局环境中查询需要作为数据框导入的表。他们可以从那里加入/合并/附加到其他本地数据帧。

  • SAS 中默认库的数据集在硬盘或文件系统文件夹上运行,您可以在其中加入/合并/附加 任何 定义库中的数据集或9.4 docs 提及:

    libref 是存储 SAS 文件的聚合存储位置的快捷方式名称或“昵称”。

    但是,当使用libname 连接到数据库时,就像在 SAS/Access API 中一样,库只是一个视觉,而不是实际的物理数据库表和视图,或者像 9.4 docs 指定的 (强调):

    libref 指定任何用作别名的 SAS 名称,以将 SAS 与数据库、架构、服务器或表和视图组相关联。与全局 SAS LIBNAME 语句一样,SAS/ACCESS LIBNAME 语句为数据存储位置创建快捷方式或昵称。 SAS libref 是虚拟或物理目录的别名。 SAS/ACCESS libref 是存储表和视图的 DBMS 数据库、架构或服务器的别名。

    物理目录的一个例外是文件级数据库,包括 MS Access 和 SQLite,它们不是服务器级数据库,如 Postgres、SQL Server、Oracle:

    libname mydata "C:\Path\To\Database.accdb";
    
    libname mydata odbc complete = "Driver={SQLite3 ODBC Driver};Database=C:\Path\To\database.db";
    

总而言之,与 Python 和 R 类似,SAS 不在物理数据库表上运行,但可能会将结果导入实际后端。因此,在您的示例中,proc sql 中的数据库表的每次调用,SAS 都会运行与 Python 和 R 类似的远程连接来检索结果,然后在客户端处理 join 到本地数据集。所有处理都可以在内存中处理,结果保存到硬盘(即临时 Work 文件夹)。用户看到的一步可能是 SAS 的多个步骤。

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多