Límite de API de 1000 registros: obtener los siguientes 1000 registros, etc. – Dotdigital, Power BI, Web API

Un usuario Pregunto ✅

Rogerh

Buenas tardes,

Soy bastante nuevo en Power BI pero he conectado algunas fuentes de datos.

Usé el servicio Power BI, Web API para conectarme a Dotdigital. Creé un flujo para los contactos: tenemos más de 150 000 registros. Sin embargo, solo obtengo 1000 registros, creo que esto se debe a la limitación de su API. (Agregué el flujo de datos a PBI Desktop para verificar y confirmar que solo hay 1000 registros en total). Para solucionar este problema antes, usé un script para obtener la ‘página siguiente’ y la ‘siguiente’ (y así sucesivamente), luego compilé la lista. Cuando probé este script en esta API, obtuve los mismos 1000 registros cada vez. (Agregué el flujo a PBID y tenía 1000 registros únicos pero 200 000 en total).

Estoy buscando una manera de recopilar los primeros 1000 registros, luego los siguientes 1000 hasta obtener todos los contactos. ¿Alguien puede ayudarme con algún código que pueda usar o basar mi investigación? Gracias por adelantado

mahoneypat

Cuando vea su documentación/sintaxis, probablemente podrá usar $skip o $skiptoken en su llamada a la API. Si es así, primero puede crear una Lista de números que se incrementan en 1000 (límite API), convertirla en una tabla, convertir los números en texto y luego agregar una columna personalizada que concatene la llamada API (con $skip o $skiptoken ) y el número. Entonces debería poder expandir las tablas devueltas y tener sus filas de 150k.

Lista de ejemplo para iniciar su consulta = List.Numbers(0,150,1000)

Si esto funciona para usted, por favor márquelo como la solución. También se agradecen los elogios. Por favor, hágamelo saber si no.

Saludos,

Palmadita

Rogerh

En respuesta a mahoneypat

@mahoneypat y @lbendlin

Gracias por sus respuestas hasta ahora, ¿puedo tener más orientación para hacer que esto funcione?

Dotmailer ha respondido con lo siguiente:

El parámetro de omisión debe usarse con el parámetro de selección cuando se desea iterar a través de un conjunto de datos completo. Si desea seleccionar los siguientes 1000 registros, debe establecer el parámetro de selección en 1000 y el parámetro de omisión en 1000, lo que devolverá los registros 1001 a 2000. Debe continuar haciendo esto hasta que se devuelvan 0 registros para recuperar todo el conjunto de datos.

Entonces, en el servicio Power BI, creo un flujo de datos: API web, introduzco la URL https://api.dotmailer.com/v2/contacts, agrego mis credenciales y me conecto.

Esto recupera los 1000 registros (aún no en una tabla) y en el Editor avanzado tiene lo siguiente

dejar
Fuente = Json.Document(Web.Contents(«https://api.dotmailer.com/v2/contactos»))
en
Fuente

Puedo entender lo que dice Mahoneypat, pero no tengo suficiente conocimiento para saber a dónde ir desde aquí.

Como práctica intenté crear la lista usando Lista.Números(0,155,1000) a concatene la siguiente URL https://api.dotmailer.com/v2/contacts?$skip=[ . I created a table but Power BI didnt reconise List.Numbers. I managed to use GENERATESERIES(1,160000,1000) to give me a list and concatinated. However I do not know how to use this in the API call.

 

What would be my next steps?

 

Additinally I tried calling just  

https://api.dotmailer.com/v2/contacts?$skip=[1000]
y
https://api.dotmailer.com/v2/contacts?$skip=[2000]
y
https://api.dotmailer.com/v2/contacts?$select={1000}&$skip={2000}
y obtuve la misma lista de contactos cada vez. (Probé otros ejemplos con los mismos resultados)
¿Sabes lo que me estoy perdiendo aquí?
Gracias por adelantado

mahoneypat

En respuesta a Rogerh

Por favor, esta consulta como un ejemplo de cómo abordar esto. Para ver cómo funciona, simplemente cree una consulta en blanco, vaya al Editor avanzado y reemplace el texto allí con el código M a continuación.

Es posible que aún deba resolver la llamada web (también puede intentarlo sin los corchetes). Si tiene éxito, puede presionar expandir en el último paso de esta consulta y, con suerte, combinar todo el JSON. Pero es posible que se necesite una función para extraer sus datos de cada retorno de JSON. Como no pude autenticar, no pude verificar esa parte.

let
    Source = List.Numbers(0,150,1000),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Changed Type" = Table.TransformColumnTypes(#"Converted to Table",{{"Column1", type text}}),
    #"Added Prefix" = Table.TransformColumns(#"Changed Type", {{"Column1", each "[" & _, type text}}),
    #"Added Suffix" = Table.TransformColumns(#"Added Prefix", {{"Column1", each _ & "]", type text}}),
    #"Added Custom" = Table.AddColumn(#"Added Suffix", "WebCalls", each Web.Contents("https://api.dotmailer.com/v2/contacts?$select=[1000]&$skip=" & [Column1]))
in
    #"Added Custom"

Si esto funciona para usted, por favor márquelo como la solución. También se agradecen los elogios. Por favor, hágamelo saber si no.

Saludos,

Palmadita

lbendlin

En respuesta a mahoneypat

Buen código. La parte difícil será saber cuándo parar. La documentación dice que mire el número de filas devueltas y se detenga cuando sea cero.

¿Quizás una función recursiva sería mejor?

lbendlin

Debe verificar en la documentación de la API de Dotdigital cómo especificar el desplazamiento cuando solicita sus datos.

Rogerh

En respuesta a lbendlin

Gracias por su respuesta. No puedo encontrar la respuesta en la documentación de la API, así que les he enviado un ticket para averiguarlo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *