Как вытащить связанные данные из базы данных в R Notebook в IBM DSX?
Я хотел бы сослаться на таблицу в базе данных в записной книжке R на DSX.
Я установил соединение с моей базой данных GreenPlum и настроил одну таблицу в качестве актива данных в моем проекте. В моей записной книжке R я перешел к "Соединениям" и создал список с моими учетными данными для базы данных:
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.
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)
В итоге я получаю сообщение об ошибке: "Ошибка в handle_url (handle, url,...): необходимо указать хотя бы один из URL или handle"
Я также попробовал setHadoopConfig
функционировать в IBM Resource; однако это дало мне еще одну ошибку для значения свойства fs.swift.service.keystone.tenant не должно быть нулевым.
Мой главный вопрос - к какой функции мне нужно добавить аргумент handle/url? Я не совсем понимаю, что делает вспомогательная функция, но у меня есть ощущение, что объект auth_url не назначается.
2 ответа
Мне удалось подключить базу данных GreenPlum с помощью RPostgreSQL
пакет.
В частности, мне нужно было передать хост / порт моего 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)
Если вы не знаете, где находится хост / порт вашего безопасного шлюза, это можно найти на панели мониторинга безопасного шлюза BlueMix. Сначала перейдите к "Интегрировать" в консоли BlueMix, затем выберите свой Secure Gateway. Находясь в панели управления, посмотрите в пункт "Назначения" -> "Настройки" (значок шестеренки), и хост и порт будут перечислены с "Cloud Host: Port".
Если вам захочется, вам может потребоваться воссоздать пункт назначения Secure Gateway, если вы создали его перед добавлением соединения в ваш проект.
Итак, я немного покопался в этом. Для работы с Greenplum на DSX вы можете установить пакет PivotalR. Вы устанавливаете это с:
install.packages("PivotalR")
Затем загрузите его:
library(PivotalR)
Оттуда вы можете настроить соединение базы данных с вашей базой данных Greenplum. Согласно документации, для этого используется пакет 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')
Я написал краткий обзор запросов и записи данных в базу данных PostgreSQL, которая может быть полезна для вашего случая, так как вы работаете внутри RStudio.