El Problema
Probaré un nuevo acrónimo aquí - B2G - Business To GIS - que significa la entrega de datos gestionados externamente en ArcGIS. Es muy común que los sistemas externos ("business") ofrezcan una REST API que puedes llamar para obtener datos en formato común como JSON, pero también es muy común que el servidor entregue un conjunto de datos en múltiples fragmentos (es decir, "páginas"), y que el JSON no esté en un dialecto bien definido como GeoJSON - tienes que analizarlo en columnas, potencialmente desde objetos struct o array.
Esta publicación trata sobre conquistar los dos desafíos de paginación y análisis, sin codificación, usando ArcGIS Data Interoperability.
Mis datos temáticos son las datos de quejas de clientes de la Federal Communications Commission sobre llamadas no deseadas, filtrados para 2024. Si quieres ver cómo se ve como JSON entrante haz clic aquí para 1000 registros aleatorios, pero aquí está el resultado final como un servicio de entidades:
FCC Customer Complaints - unwanted calls
Algunas investigaciones revelan que existen varios enfoques comunes de paginación:
- Parámetros offset y limit que definen la posición inicial de fila y el conteo de filas, leyendo datos ordenados.
- Este enfoque puede incluir otro parámetro para qué propiedad establece el orden de clasificación
- Número de página y (opcionalmente) parámetros de tamaño de página.
- Paginación basada en consulta, donde una fila inicial se define por una consulta lógica, implicando cualquier consulta siguiente.
- Consulta basada en tiempo, un caso especial de paginación basada en consulta.
- Paginación basada en cursor, donde la API proporciona nombres de página, incluyendo cualquier página siguiente, en el resultado.
- Combinaciones de los anteriores.
Los dos primeros enfoques son los más simples (y los únicos que he usado), el servidor hace los cálculos para construir la página y el cliente solo necesita llevar un contador simple, enviando solicitudes hasta que los datos se agoten.
Aquí hay un ejemplo de una API basada en offset y limit y aquí hay un ejemplo de una API basada en páginas.
Para un ejemplo del #6, combinando #3 & #4, puedes leer sobre consultar capas de servicios de entidades alojadas. ArcGIS se encarga de construir consultas para capas por ti.
¿Qué tal hacer el análisis también sencillo? ¡Tenemos que convertir registros como este en columnas tipadas y geometría!
{
"issue_type" : "Teléfono",
"caller_id_number" : "830-210-2001",
"state" : "IL",
"method" : "Cableado",
"advertiser_business_phone_number" : "Ninguno",
"issue_time" : "8:41 am",
"issue" : "Llamadas No Deseadas",
"zip" : "60629",
"type_of_call_or_messge" : "Voz en Vivo",
"issue_date" : "2024-01-04T00:00:00.000",
"id" : "3739134",
"location_1" : {
"latitude" : "41.781382",
"human_address" : "{\"address\": \"\", \"city\": \"IL\", \"state\": \"\", \"zip\": \"60629-5219\"}",
"needs_recoding" : false,
"longitude" : "-87.732853"
}
}
¡No hay problema! Empecemos.
Paginación
Estamos llamando a una REST API aquí, y ofrece una respuesta paginada. En ArcGIS Data Interoperability eso significa llamar al transformador HTTPCaller en un bucle, en este caso con parámetros offset, limit y order, incrementando el valor offset cada llamada, hasta que se reciben todos los datos y la respuesta es un arreglo vacío. Puede que no supieras que puedes hacer bucles en un entorno de programación visual, pero puedes, y es fácil. El transformador personalizado verde menta llamado "UnwantedCallsLooper" cerca arriba a la izquierda en mi espacio de trabajo hace el trabajo. Es un transformador personalizado con bucle.
Espacio de trabajo ETL principal
El transformador personalizado está incrustado (incluido) en el lienzo Principal, vive en su propia pestaña homónima. Creas transformadores personalizados seleccionando uno o más transformadores ordinarios en el lienzo Principal luego un menú contextual accesible con clic derecho ofrece una opción para crear transformador personalizado. En mi caso seleccioné solo un transformador HTTPCaller.
Después de crear el transformador personalizado hubo más pasos de edición para configurar el bucle:
- Añadir una conexión de retorno del bucle usando una opción del menú contextual en el lienzo
- Añadir una prueba para completar antes del retorno del bucle
- Incrementar el parámetro offset
A continuación se muestra cómo luce mi transformador personalizado. En tiempo de ejecución cada entidad que llega desde el lienzo Principal tiene un atributo offset usado por el transformador HTTPCaller. Los parámetros limit y order no cambian así que están “codificados” directamente en HTTPCaller. El flujo inferior es la condición del bucle hasta - si la respuesta no es un arreglo vacío los datos no están agotados, así que incrementa offset y ¡bucle!
Transformador personalizado con bucle
Análisis
Cada respuesta API es un arreglo de structs JSON y está contenido en un atributo llamado "_response_body." El arreglo se explota en entidades separadas con un JSONFragmenter. El parámetro JSON Query solo significa que estamos fragmentando el arreglo del nivel superior y las otras configuraciones solo aseguran la entrega de fragmentos que se parecen al bloque de código arriba.
JSONFragmenter
Ahora analizamos cada entidad fragmento con un JSONExtractor.
JSONExtractor
La cuadrícula Extract Queries define los nombres de atributos de salida y de dónde provienen los datos en el fragmento. El Las consultas JSON siguen una sintaxis simple que puedes escribir, pero hay un truco sencillo para obtener un selector que te permita navegar por la estructura JSON y automatizar la generación de consultas. Antes del JSONExtractor, temporalmente muestrea una sola característica y escríbela en un archivo, luego configura temporalmente tu fuente de entrada JSONExtractor a este archivo y obtendrás un selector útil para tus consultas! Cuando hayas completado tus consultas de extracción, elimina el Sampler y restablece la fuente de entrada JSONFragmenter para que sea el documento en _response_body.<\/P>
¡Así que eso es paginación y análisis desmitificados! En la descarga del blog hay dos archivos fmw de espacio de trabajo fuente. CreateFC crea una geodatabase de archivos como salida y es donde descubrí el procesamiento de datos, como corregir errores de datos que impedían la creación de un campo datetime. Quería una clase de entidad inicial de todos modos para simbolizar y compartir como mi servicio de entidades alojado objetivo. UpdateFS toma prestados los pasos de procesamiento de datos en CreateFC pero contiene el transformador personalizado con bucle y algo de lógica para detectar y aplicar cambios de datos cada vez que se ejecuta la herramienta ETL, que es lo que probablemente necesitarás en producción.<\/P>
Por favor comenta en esta publicación con cualquier pregunta u observación. ¡Sigue paginando!<\/P>
<\/P>