Pentaho Data Integration - guardar registro con espacio incluido

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
En un confuso incidente un pequeño requerimiento de cambio en un proceso de carga masiva de datos terminó en mis manos.

Nosotros periódicamente insertamos sobre nuestra base de datos registros leídos desde un archivo de texto plano grandote. Ese archivo de texto plano se lee con Pentaho Data Integration.

Antes de que me digan "oye, cambia Pentaho por xxx porque es mil veces mejor y blablabla", les cuento que Pentaho hace mil hueas más de lógica de negocio antes de insertar el registro y portarlo todo no está en mis planes, para efectos prácticos sólo necesito cambiar la forma de parsear un registro nada más.

Pues bien, la cosa es que el proveedor que nos entrega el texto planos con los datos actualmente nos envía estos registros

Código:
1999-01-01 00:00 "ruta/thebeatles/yellow sumarine.mp3"

y nosotros lo guardamos en una tabla en los campos FECHA y RUTA del audio. Como pueden darse cuenta, la ruta de la canción está entre comillas dobles e incluye un espacio y se guarda bien con esta configuración.

NkLjhpt.jpg



El proveedor dijo que la fecha que estaba enviando no servía de nada y para aligerar el proceso removió la fecha/hora y me va a mandar únicamente un registro con la RUTA del audio. Algo así

Código:
ruta/thebeatles/yellow sumarine.mp3

sin comillas ni nada.

Yo hice todos los cambios estructurales en la base de datos y en pentaho para que ahora leyera solamente UN VALOR del archivo de entrada. La cosa es que cuando comienza a insertar en la base de datos me guarda esto

Código:
ruta/thebeatles/yellow

o sea, el hueon se detiene en el espacio y ahí corta. Evidentemente tiene por defecto la instrucción de cortar el registro en el primer espacio que vea, pero yo necesito decirle que me GUARDE TODA LA PUTA LINEA DE PRINCIPIO A FIN.

Y5BYm5l.jpg



ahí donde dice Delimiter no hay nada. Bueh, igual me corta el texto de la ruta en el primer espacio que lee y me guarda eso nomás. No hay mucha info así que voy a ir a meterme al submundo de la comunidad de pentaho, pero si alguien tiene un dato que me de se lo agradezco.
 

Harima

Pegao al tarro
Se incorporó
15 Mayo 2008
Mensajes
3.958
Esta complicado, las pocas veces que he visto eso, por defecto pentaho solo separa por el carácter que se le indica, el que elijas para el formato de los csv usualmente se recomienda | ó ; si no esta tomando los espacios, es porque el modulo de carga fue modificado, no es el pentaho ni la forma en la que se lee un csv en la mayoría de los sistemas.
suerte en esta, va a estar difícil
lo que se me ocurre que pueden hacer por el momento es cambiar los espacios por guiones - ó _ , o algún otro carácter, ya que parece que el proveedor se hizo el wn olímpicamente.
 
Upvote 0

t3b4n

Ocioso
Se incorporó
27 Febrero 2006
Mensajes
1.659
En primer lugar, te recomiendo hacer preview en Spoon (la interfaz gráfica) de lo que está leyendo Pentaho desde el archivo de entrada. Al hacerle preview al step podemos confirmar si el problema es en la lectura de los datos o en otro step intermedio (no me queda claro este punto).
En segundo, si el archivo no es delimitado no deberías usar el step "CSV Input". Mejor cámbiate a un text file input y lo defines como fixed length, estableciendo como largo máximo el tamaño que te vayan a mandar en el archivo o el máximo número de caracteres que soporte la columna de la tabla donde vas a guardar el registro.

Postea el resultado de la primera prueba por acá para seguir ayudando :)
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
En primer lugar, te recomiendo hacer preview en Spoon (la interfaz gráfica) de lo que está leyendo Pentaho desde el archivo de entrada. Al hacerle preview al step podemos confirmar si el problema es en la lectura de los datos o en otro step intermedio (no me queda claro este punto).
En segundo, si el archivo no es delimitado no deberías usar el step "CSV Input". Mejor cámbiate a un text file input y lo defines como fixed length, estableciendo como largo máximo el tamaño que te vayan a mandar en el archivo o el máximo número de caracteres que soporte la columna de la tabla donde vas a guardar el registro.

Postea el resultado de la primera prueba por acá para seguir ayudando :)

Este dato está interesante, lo voy a probar. Gracias.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Esta complicado, las pocas veces que he visto eso, por defecto pentaho solo separa por el carácter que se le indica, el que elijas para el formato de los csv usualmente se recomienda | ó ; si no esta tomando los espacios, es porque el modulo de carga fue modificado, no es el pentaho ni la forma en la que se lee un csv en la mayoría de los sistemas.
suerte en esta, va a estar difícil
lo que se me ocurre que pueden hacer por el momento es cambiar los espacios por guiones - ó _ , o algún otro carácter, ya que parece que el proveedor se hizo el wn olímpicamente.

El proveedor manda el archivo nomás, para él es indiferente el método o la herramienta de software que usamos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Hola, @Zuljin. En qué quedó esto? Pudiste resolverlo o aún necesitas ayuda?

Resolví ese problema particular del salto de línea pero ahora estoy hueveando con otro cacho con Pentaho. Hueas típicas que pasan cuando uno tiene que mantener un sistema culiado del que no tenía pico idea.
 
Upvote 0

taylox

Miembro Regular
Se incorporó
20 Julio 2020
Mensajes
62
para quitar los saltos de linea debes hacer una limpieza

char(9) char(10) char(13) char(160)

tab - salto de linea - enter - espacio oculto (siempre da error)
puedes ocupar una funciona de reemplazar

Saludos
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
para quitar los saltos de linea debes hacer una limpieza

char(9) char(10) char(13) char(160)

tab - salto de linea - enter - espacio oculto (siempre da error)
puedes ocupar una funciona de reemplazar

Saludos

Vale pero tengo que mantener el archivo base.

Ahora el jugo que tengo es que no guarda algunos registros, no se por qué.
 
Upvote 0

t3b4n

Ocioso
Se incorporó
27 Febrero 2006
Mensajes
1.659
Vale pero tengo que mantener el archivo base.

Ahora el jugo que tengo es que no guarda algunos registros, no se por qué.
Opciones: cambiar el nivel de log a "Debug" o "Row level" y revisar en el log.
Agregar un flujo alternativo: pon un step "dummy" detrás del table output y desde el table output sacas un hop de tipo "Error handling of step". Con esto consigues que al step dummy lleguen todos los registros que generan problemas al momento de hacer el insert y con ello también puedes identificar el motivo, ya sea mediante la revisión de datos o mediante la columna que contiene los errores.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Opciones: cambiar el nivel de log a "Debug" o "Row level" y revisar en el log.
Agregar un flujo alternativo: pon un step "dummy" detrás del table output y desde el table output sacas un hop de tipo "Error handling of step". Con esto consigues que al step dummy lleguen todos los registros que generan problemas al momento de hacer el insert y con ello también puedes identificar el motivo, ya sea mediante la revisión de datos o mediante la columna que contiene los errores.

Vale, voy a intentar.

Cachai que el origen de datos es un archivo de texto plano con cientos de miles de registros.

Haciendo cuadratura veo que hay registros que no ingresan. Entonces lo que hago es identificar algún registro de los que no se hayan ingresado, cortar el archivo de texto plano y lo dejo en, no sé, 10 registros, y el registro con problemas lo dejo al medio.
La huea es que cuando echo a andar el proceso el muy culiado SI INGRESA EL REGISTRO.

Eso me da una sospecha de que puede estar fallando en memoria caché, buffer o alguna cosa así.
 
Upvote 0

t3b4n

Ocioso
Se incorporó
27 Febrero 2006
Mensajes
1.659
Vale, voy a intentar.

Cachai que el origen de datos es un archivo de texto plano con cientos de miles de registros.

Haciendo cuadratura veo que hay registros que no ingresan. Entonces lo que hago es identificar algún registro de los que no se hayan ingresado, cortar el archivo de texto plano y lo dejo en, no sé, 10 registros, y el registro con problemas lo dejo al medio.
La huea es que cuando echo a andar el proceso el muy culiado SI INGRESA EL REGISTRO.

Eso me da una sospecha de que puede estar fallando en memoria caché, buffer o alguna cosa así.
Entonces puedes usar la pestaña de performance para ver cuántos registros se están procesando por segundo en cada step. Cuando hay problemas de memoria se empieza a notar en la performance del step que genera problemas, en cuyo caso la ejecución de la transformación toma mucho tiempo, porque java empieza a hacer garbage collection cuando se llena la memoria de challa, lo que impide que siga con el resto de los steps o sigue muy lento. Gracias a la pestaña de performance se puede identificar ese escenario (y mirando al aministrador de tareas igual; cuando llegues al tope de memoria asignada a spoon ya sabes que va a empezar a ponerse lento).

Con esa información vas a poder optimizar el proceso, eliminando datos que no necesitas y que consumen memoria.
 
Upvote 0

Lordnet

Autoridad Ancestral de Transacciones
Se incorporó
11 Junio 2004
Mensajes
2.231
hola, utilizaré este mismo tema ya que mi duda tambien es con pentaho

necesito ejecutar una consulta es muy grande para el sistema, necesito extraer 3 meses de transacciones.
anteriormente salía del paso dividiendo el problema en 3 consultas SQL (1 por mes), ya que al ejecutar directamente los 3 meses, la consulta al final se caía luego de 2 horas sin entregar resultados.

ahora el volumen transaccional no da abasto. y me gustaría hacer algo mas robusto mas allá de volver a dividir el problema en una consulta por semana.

de ahi que pensé en pentaho para abordarlo en un ciclo
es decir, de alguna forma construir un loop que ejecute la consulta 90 veces modificando el campo fecha en cada ejecución. (1 por cada día calendario), asi evitamos que la BD no entregue nada por timeout. resolviendo 90 problemas pequeños en vez de uno gigante.

por si surge la pregunta la consulta se hace a una tabla principal, donde se extraen datos de otras 3 mediante inner join.
algunos de los campos tienen índice. no veo en el explain plan un full table scan, hay nested loops y table access indexados.

alguien lo ha hecho?
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
hola, utilizaré este mismo tema ya que mi duda tambien es con pentaho

necesito ejecutar una consulta es muy grande para el sistema, necesito extraer 3 meses de transacciones.
anteriormente salía del paso dividiendo el problema en 3 consultas SQL (1 por mes), ya que al ejecutar directamente los 3 meses, la consulta al final se caía luego de 2 horas sin entregar resultados.

ahora el volumen transaccional no da abasto. y me gustaría hacer algo mas robusto mas allá de volver a dividir el problema en una consulta por semana.

de ahi que pensé en pentaho para abordarlo en un ciclo
es decir, de alguna forma construir un loop que ejecute la consulta 90 veces modificando el campo fecha en cada ejecución. (1 por cada día calendario), asi evitamos que la BD no entregue nada por timeout. resolviendo 90 problemas pequeños en vez de uno gigante.

por si surge la pregunta la consulta se hace a una tabla principal, donde se extraen datos de otras 3 mediante inner join.
algunos de los campos tienen índice. no veo en el explain plan un full table scan, hay nested loops y table access indexados.

alguien lo ha hecho?

¿En qué motor de base de datos?
 
Upvote 0
Se incorporó
4 Octubre 2007
Mensajes
338
hola, utilizaré este mismo tema ya que mi duda tambien es con pentaho

necesito ejecutar una consulta es muy grande para el sistema, necesito extraer 3 meses de transacciones.
anteriormente salía del paso dividiendo el problema en 3 consultas SQL (1 por mes), ya que al ejecutar directamente los 3 meses, la consulta al final se caía luego de 2 horas sin entregar resultados.

ahora el volumen transaccional no da abasto. y me gustaría hacer algo mas robusto mas allá de volver a dividir el problema en una consulta por semana.

de ahi que pensé en pentaho para abordarlo en un ciclo
es decir, de alguna forma construir un loop que ejecute la consulta 90 veces modificando el campo fecha en cada ejecución. (1 por cada día calendario), asi evitamos que la BD no entregue nada por timeout. resolviendo 90 problemas pequeños en vez de uno gigante.

por si surge la pregunta la consulta se hace a una tabla principal, donde se extraen datos de otras 3 mediante inner join.
algunos de los campos tienen índice. no veo en el explain plan un full table scan, hay nested loops y table access indexados.

alguien lo ha hecho?

Primero necesitas generar las fechas a consultar, una fecha por fila. Puede ser con un Table Input a una tabla de calendario por ejemplo.

Después conectas esa caja a un Execute SQL Script, y activas la opción "Execute for each row" y en parameters pones el campo fecha que generates anteriormente


1643115761693.png


En la query vas a tener por ejemplo un where con tu campo de fecha que quieres parametrizar, lo tienes que dejar con signo de interrogación:

SQL:
WHERE fecha = '?' AND ...

Si corres la transformación en modo debug puedes ver como va llamando a cada query con la variable reemplazada
 

Archivo adjunto

  • 1643115668033.png
    1643115668033.png
    26,8 KB · Visitas: 113
Última modificación:
Upvote 0
Subir