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

How to pull connected data from database into R Notebook in IBM DSX?

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

我已经建立了到我的 GreenPlum 数据库的连接,并在我的项目中设置了一个 table 作为数据资产。在我的 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,这似乎给出了一个明显的错误,即 url 是丢失的。所以我 运行 这个函数试图将结果分配给数据框:

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

我最后收到的错误是:"Error in handle_url(handle, url, ...): Must specify at least one of url or handle"

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

我的主要问题是我需要向哪个函数添加 handle/url 参数?我不明白辅助函数到底在做什么,但我感觉 auth_url 对象没有被赋值。

所以,我对这个做了一点挖掘。要在 DSX 上使用 Greenplum,您可以安装 PivotalR 包。你安装它:

install.packages("PivotalR")

然后加载它:

library(PivotalR)

从那里,您可以设置到您的 Greenplum 数据库的数据库连接。根据 documentation,它为此使用了 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) 

或者,您可以阅读整个 table:

dbReadTable(conn, 'my_table')  

我已经 written a quick run through on querying and writing data to a PostgreSQL database 这可能对你的情况有用,因为你在 RStudio 中工作。

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

具体来说,我需要将我的 IBM Secure Gateway 的 host/port 传递给 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)

如果您不知道安全网关的 host/port 在哪里,可以在 BlueMix 的安全网关仪表板上找到。首先,转到 BlueMix 控制台中的 "Integrate",然后 select 您的 Secure Gateway。进入仪表板后,查看 Destinations -> Settings(齿轮图标),主机和端口以 "Cloud Host : Port".

列出

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