如何将连接数据从数据库中提取到IBM DSX中的R Notebook?

时间:2018-01-29 02:42:28

标签: r data-science-experience

我想在DSX上的R笔记本中引用数据库中的表。

我已建立与GreenPlum数据库的连接,并在我的项目中将一个表设置为数据资产。在我的R笔记本中,我已导航到“Connections”并使用我的数据库凭据创建了一个列表:

credentials_1 <-list(database = "database",password = 
"password",sg_service_url = "https://sgmanager.ng.bluemix.net",port = 
"1111",host = "111.111.111.11",sg_gateway_id = "XXXXXXX_prod_ng",username = 
"username",sg_security_token = "XXXXXX",connection_path = 
"/analytics/ibm_test")

接下来,我使用了这个IBM Resource.

的辅助函数
getObjectStorageFile <- function(credentials) {
if(!require(httr)) install.packages('httr')
if(!require(RCurl)) install.packages('RCurl')
library(httr, RCurl)
auth_url <- paste(credentials[['sg_service_url']],'/v3/auth/tokens', sep= '')
auth_args <- paste('{"auth": {"identity": {"password": {"user": {"domain": {"id": ', credentials[['domain_id']],'},"password": ',
               credentials[['password']],',"name": ', credentials[['username']],'}},"methods": ["password"]}}}', sep='"')
auth_response <- httr::POST(url = auth_url, body = auth_args)
x_subject_token <- headers(auth_response)[['x-subject-token']]
auth_body <- content(auth_response)
access_url <- unlist(lapply(auth_body[['token']][['catalog']], function(catalog){
    if((catalog[['type']] == 'object-store')){
        lapply(catalog[['endpoints']], function(endpoints){
            if(endpoints[['interface']] == 'public' && endpoints[['region_id']] == credentials[['region']]) {
               paste(endpoints[['url']], credentials[['container']], credentials[['filename']], sep='/')}
        })
    }
})) 
data <- content(httr::GET(url = access_url, add_headers ("Content-Type" = "application/json", "X-Auth-Token" = x_subject_token)), as="text")
textConnection(data)
}

请注意,我将auth_url <- ....'auth_url'更改为auth_url <- ....'sg_service_url',因为我插入的凭据没有auth_url,而且似乎显示错误的网址丢失。所以我在尝试将结果分配给数据框时运行了这个函数:

R.data.frame <- getObjectStorageFile(credentials_1)
head(R.data.frame)

我最终收到的错误是:“handle_url中的错误(句柄,网址,...):必须至少指定一个网址或句柄”

我还在IBM Resource内尝试了setHadoopConfig功能;但是,这给了我另一个错误属性fs.swift.service.keystone.tenant的值不能为空。

我的主要问题是我需要添加句柄/ url参数的哪个函数?我不明白帮助函数究竟在做什么,但我感觉没有分配auth_url对象。

2 个答案:

答案 0 :(得分:0)

所以,我对这一点进行了一些挖掘。要在DSX上使用Greenplum,您可以安装PivotalR软件包。您可以使用以下命令安装:

install.packages("PivotalR")

然后加载它:

library(PivotalR)

从那里,您可以设置与Greenplum数据库的数据库连接。根据{{​​3}},它使用RPostgreSQL包。因此,基本连接示例可能是:

drv <- dbDriver( "PostgreSQL" )
db <- 'myDatabase'  
host_db <- 'mydb1.example.com'  
db_port <- '98939'  
db_user <- 'henryviii'  
db_password <- 'happydays'

conn <- dbConnect(drv, dbname=db, host=host_db, port=db_port, user=db_user, password=db_password)

然后运行SQL查询,如:

myQuery<- dbSendQuery(conn, 'select some_column from my_table;')  
result <- fetch(myQuery) 

或者,您可以阅读整个表格:

dbReadTable(conn, 'my_table')  

documentation因为您在RStudio内部工作而对您的案件有用。

答案 1 :(得分:0)

我能够使用RPostgreSQL包连接GreenPlum数据库。

具体来说,我需要将IBM Secure Gateway的主机/端口传递给dbConnect函数

library(RPostgreSQL) ## Load library

## Assign Credentials
drv <- dbDriver( "PostgreSQL" )
db <- "database_name"
host_db <- "cap-sg-prd-5.integration.ibmcloud.com" ### IBM SG host link
db_port <- 18999 ## IBM SG port as an integer
db_user <- "username"
db_password <- "password"

## Make the connection
conn <- dbConnect(drv, dbname=db, host=host_db, port=db_port, user=db_user, password=db_password)

如果您不知道Secure Gateway的主机/端口在哪里,可以在BlueMix的Secure Gateway Dashboard上找到。首先,转到&#34;整合&#34;在BlueMix控制台中,然后选择您的Secure Gateway。进入仪表板后,查看目的地 - &gt;设置(齿轮图标)以及主机和端口与&#34;云主机:端口&#34;一起列出。

抬头,如果您在将连接添加到项目之前创建了此目标,则可能需要重新创建Secure Gateway目标。