如何使用SparkR::read.jdbc()或sparkyr::spark_read_jdbc()来获取SQL查询结果,而不是整个表?

如何使用SparkR::read.jdbc()或sparkyr::spark_read_jdbc()来获取SQL查询结果,而不是整个表?,sql,r,jdbc,sparkr,Sql,R,Jdbc,Sparkr,我通常在本地使用RODBC查询我的数据库。然而,我们公司最近转向了Azure Databricks,它本身不支持RODBC或其他odbc连接,但支持我以前从未使用过的jdbc连接 我已经阅读了SparkR::read.jdbc()和sparkyr::spark_read_jdbc()的文档,但它们似乎从数据库中提取了整个表,而不仅仅是查询结果,这对我来说并不合适,因为我从不需要拉取整个表,而是运行将多个表连接在一起的查询,但只返回每个表中非常小的数据子集 我找不到使用jdbc连接器执行以下操作的

我通常在本地使用RODBC查询我的数据库。然而,我们公司最近转向了Azure Databricks,它本身不支持RODBC或其他odbc连接,但支持我以前从未使用过的jdbc连接

我已经阅读了SparkR::read.jdbc()和sparkyr::spark_read_jdbc()的文档,但它们似乎从数据库中提取了整个表,而不仅仅是查询结果,这对我来说并不合适,因为我从不需要拉取整个表,而是运行将多个表连接在一起的查询,但只返回每个表中非常小的数据子集

我找不到使用jdbc连接器执行以下操作的方法:

(A) 运行引用同一数据库上多个表的查询

(B) 将结果存储为R数据帧或可以非常容易地转换为R数据帧的东西(例如SparkR或SPARKYR数据帧)

如果可能的话,解决方案也只需要为每个脚本/笔记本指定一次连接凭据,而不是每次连接到数据库以运行查询并将结果存储为数据帧时

e、 g.是否有以下jdbc等价物:

my_server="myserver.database.windows.net"
my_db="mydatabase"
my_username="database_user"
my_pwd="abc123Ineedabetterpassword"


myconnection <- RODBC::odbcDriverConnect(paste0("DRIVER={SQL Server};
                                 server=",my_server,";
                                 database=",my_db,";
                                 uid=",my_username,";
                                 pwd=",my_pwd))

df <- RODBC::sqlQuery(myconnection, 
"SELECT a.var1, b.var2, SUM(c.var3) AS Total_Things, AVG(d.var4) AS Mean_Stuff
FROM table_A as a 
JOIN table_B as b on a.id = b.a_id
JOIN table_C as c on a.id = c.a_id
JOIN table_D as d on c.id = d.c_id
Where a.filter_var IN (1, 2, 3, 4)
AND d.filter_var LIKE '%potatoes%'
GROUP BY
a.var1, b.var2
")

df2 <- RODBC::sqlQuery(myconnection,
"SELECT x.var1, y.var2, z.var3
FROM table_x as x
LEFT JOIN table_y as y on x.id = y.x_id
LEFT JOIN table_z on as z on x.id = z.x_id
WHERE z.category like '%vegetable%'
AND y.category IN ('A', 'B', 'C')
“)
my_server=“myserver.database.windows.net”
my_db=“mydatabase”
我的用户名=“数据库用户”
my_pwd=“ABC123INeedBetterPassword”

myconnection我最终解决了这个问题,我想在这里发布答案,以防其他人有问题

您可以在查询中使用SparkR::read.jdbc(),但必须将查询括在括号中,并将结果别名为某物,否则将出现不明确的语法错误。“portnum”作为默认1433对我来说似乎很好,但是如果您有不同类型的SQL数据库,您可能需要在URL中更改它。然后可以对包含查询结果的SparkDataFrame调用SparkR::collect(),将其转换为R数据帧:

e、 g


myconnection您好,您是如何找到解决方案的?有什么文档可以找到吗?我找不到任何连贯的文档不幸的是,我只是尝试了其他帖子中的一些东西,“结果”起了作用。
myconnection <- "jdbc:sqlserver://myserver.database.windows.net:1433;database=mydatabase;user=database_user;password=abc123Ineedabetterpassword"

df <- read.jdbc( myconnection, "(
SELECT a.var1, b.var2, SUM(c.var3) AS Total_Things, AVG(d.var4) AS Mean_Stuff
FROM table_A as a 
JOIN table_B as b on a.id = b.a_id
JOIN table_C as c on a.id = c.a_id
JOIN table_D as d on c.id = d.c_id
Where a.filter_var IN (1, 2, 3, 4)
AND d.filter_var LIKE '%potatoes%'
GROUP BY
a.var1, b.var2) as result" ) %>% 
SparkR::collect()