Conexión manual a Flight service en R
La biblioteca de código abierto de R arrow no ofrece compatibilidad nativa con el protocolo de vuelo « Apache Arrow ». El método recomendado consiste en utilizar la biblioteca R reticulate y la biblioteca de código abierto pyarrowPython para invocar Flight service desde entornos R. Aunque en la biblioteca arrow R existen funciones para llamar a los servidores de Flight, estas también utilizan reticulate, pero no están muy bien documentadas ni son tan flexibles en cuanto a parámetros y autorización.
Para saber cómo llamar a « Flight service » en cuadernos, consulta «Uso de Flight service en cuadernos de Python ».
Si utilizas el código generado automáticamente para cargar datos desde un archivo o una conexión desde el panel «Fragmentos de código» de un cuaderno, dicho código también utiliza reticulate y pyarrow para invocar a Flight service, así como la biblioteca reticulada itc_utils Python.
Si quieres escribir tu propio código para « Flight service », lo más recomendable con los cuadernos es empezar con el código que se genera automáticamente y, a continuación, modificarlo si es necesario utilizando reticulate, pyarrow y itc_utils. Tendrás que escribir tu propio código en las siguientes situaciones:
- El código generado requiere modificaciones, por ejemplo, para su uso en un entorno de producción
- La función para añadir código generado no está disponible para este recurso
- La herramienta no admite la incorporación de código generado, por ejemplo, RStudio
Interacción básica con el « Flight service »
Con el fin de ilustrar los pasos básicos y por motivos de simplicidad, los ejemplos de código de esta sección utilizan la biblioteca itc_utilsPython, proporcionada por IBM, que ofrece funciones para interactuar con Flight service.
Lectura de datos
Los pasos para leer datos de una fuente de datos son los siguientes:
- Creación de un descriptor de vuelo con los metadatos necesarios para acceder a una fuente de datos
- Creación de una instancia de un cliente de vuelos
- Envío del descriptor de vuelo a Flight service para obtener un objeto de información del vuelo
- Lectura de datos de una fuente de datos. El fragmento de código muestra cómo se lee un archivo,
pyarrow.Tableque luego se convierte en un marco de datos.
Fragmento de código de ejemplo para leer datos:
# use reticulate library to invoke Python code
library(reticulate)
# use open source R arrow library
library(arrow)
# load Python utility library provided by IBM with reticulate
itcfs <- import("itc_utils.flight_service")
# create a flight descriptor from a data request
data_request = dict(
"asset_id" = "<asset_id>",
"project_id" = "<project_id>",
"interaction_properties" = dict(
"row_limit" = 5000,
"schema_name" = "<schema>",
"table_name" = "<table>"
)
)
flightDescriptor = itcfs$get_flight_descriptor(data_request=data_request)
# create an instance of a flight client
flightClient <- itcfs$get_flight_client()
# obtain a FlightInfo object which provides information for reading data from one or more endpoints.
flightInfo <- itcfs$get_flight_info(flightClient, flight_descriptor=flightDescriptor)
# read data into a vector of pyarrow.Table objects
tables <- itcfs$read_tables(flightClient, flightInfo, timeout=240)
# convert a pyarrow.Table to an R dataframe
df <- as.data.frame(tables[[1]])
Escritura de datos
Los pasos para escribir datos en una fuente de datos son los siguientes:
- Creación de un descriptor de vuelo con los metadatos necesarios para acceder a una fuente de datos
- Creación de una instancia de un cliente de vuelos
- Autenticación con Flight service
- Obtener un flujo de escritura en vuelo
- Escribir datos en un destino de datos
Fragmento de código de ejemplo para escribir datos:
# use reticulate library to invoke Python code
library("reticulate")
# use open source R arrow library
library("arrow")
# load Python utility library provided by IBM with reticulate
itcfs <- import("itc_utils.flight_service")
# create a flight descriptor
nb_data_request = dict (
"asset_id" = "<asset_id>",
"project_id" = "<project_id>",
"interaction_properties" = dict (
"schema_name" = "<schema>",
"table_name" = "<table>",
"existing_table_action" = 'truncate',
)
)
flightDescriptor = itcfs$get_flight_descriptor(data_request=data_request)
# create an instance of a flight client
flightClient <- itcfs$get_flight_client()
# write a data to a data target
itcfs$write_table(as_arrow_table(data_df_2),flightDescriptor,flightClient)
Descripción del vuelo
Un elemento fundamental de la interacción con Flight service es el descriptor de vuelo, que especifica el acceso a la fuente de datos. Incluye una especificación de la fuente de datos en forma de propiedades de conexión, como el host, el puerto, etc., y propiedades de interacción, como el nombre de una tabla o una instrucción SQL. En lugar de las propiedades de conexión, también puedes especificar los ID del activo y del proyecto o del espacio de implementación.
Técnicamente, Flight service espera un descriptor de vuelo en forma de cadena JSON. La mejor práctica en los cuadernos de R es utilizar reticulate para crear un diccionario de tipo « Python » con las propiedades de la solicitud y la itc_utils función get_flight_descriptor para crear un descriptor de vuelo:
data_request = dict(
"asset_id" = "<asset_id>",
"project_id" = "<project_id>",
"interaction_properties" = dict(
"row_limit" = 5000,
"schema_name" = "",
"table_name" = ""
)
)
flightDescriptor = itcfs$get_flight_descriptor(data_request=data_request)
Los descriptores de vuelo para leer o escribir datos solo difieren ligeramente en lo que respecta interaction_properties a... Las solicitudes de lectura suelen tener propiedades de interacción como «sql_statement», «file_name» o «table_name», mientras que las solicitudes de escritura cuentan con propiedades de interacción adicionales, como «existing_table_action» o «file_format».
Para obtener más información sobre la sintaxis de las solicitudes de datos, consulte «Solicitudes de datos de vuelo ».
Autenticación con el servidor de vuelos
Debes autenticarte en Flight service con un token de portador válido. Para ello, puedes utilizar el siguiente fragmento de código para escribir una clase de controlador de autenticación personalizada y crear una instancia de dicha clase.
Dado que, en los cuadernos de R, se accede a « Flight service » mediante funciones pyarrow reticuladas escritas en « Python », el ejemplo de código muestra un enfoque posible, aunque eficaz, para crear un controlador de autenticación personalizado. Una buena práctica en los cuadernos de R es utilizar las funciones itc_utilsTokenClientAuthHandler() reticuladas, o mejor aún get_flight_client()...
library("reticulate")
flight <- import("pyarrow.flight")
TokenClientAuthHandler <- PyClass(
"TokenClientAuthHandler",
list(
bearer_token = NULL,
outgoing = NULL,
incoming = NULL,
`__init__` = function(self, bearer_token){
super()$`__init__`()
self$token <- charToRaw(bearer_token)
NULL
},
authenticate = function(self, outgoing, incoming){
outgoing$write(self$token)
self$token <- incoming$read()
},
get_token = function(self){
return(self$token)
}
),
inherit = flight$ClientAuthHandler
)
library(ibmWatsonStudioLib)
wslib <- access_project_or_space()
token <- paste("Bearer ", wslib$auth$get_current_token(), sep = "")
authHandler <- TokenClientAuthHandler(token)