Ho utilizzato Generatore di query e File->Connetti a->ODBC->Apri tabella del database per ottenere dati da un database PostgreSQL.
La tabella che sto recuperando dal database contiene una colonna con lunghe stringhe di testo.
Le mie stringhe di testo vengono troncate quando superano la lunghezza di 524.587 (2^19 -1)
Esiste un'impostazione in JMP e/o JSL che posso modificare per abilitare l'interrogazione di valori stringa più lunghi?
Situazione motivante e risultati del debug
Ho esplorato le funzionalità del componente aggiuntivo Torch Deep Learning .
Ho scaricato un set di dati da Kaggle relativo alla sfida Cani contro Lupi .
Ho utilizzato la funzione "Importa più file" di JMP per creare una tabella dati contenente tutti questi file (2000 file).
Ho utilizzato JMP per ripulire i dati, creare una colonna di risposta, colonne di convalida, ecc.
Ho creato un database PostgreSQL, lo schema e la tabella.
Ho utilizzato JMP per connettermi alla tabella del database, ho concatenato i dati di Dogs vs Wolves e ho salvato le informazioni nel database. La colonna delle immagini viene salvata come testo nel database utilizzando new image( char to blob("...le informazioni sull'immagine...") ).
Ho controllato i dati nel database e tutto sembra corrispondere alle aspettative.
Ho utilizzato Query Builder per connettermi al mio database ed eseguire una query sull'intera tabella Dogs vs Wolves.
Ho convertito la colonna Immagine dal tipo di dati Carattere a Espressione per visualizzare le immagini nella tabella dati. Delle 2.000 voci, 1.986 funzionano come previsto. 14 immagini non vengono visualizzate correttamente. Queste voci includono le seguenti immagini:
- lupi/nomi-dei-lupi-e1528831052890.jpg
- lupi/cuccioli di lupo.jpg
- lupi/lupo-4191896__480.png
- lupi/pexels-photo-682375.jpeg
- lupi/pexels-photo-682361.jpeg
- lupi/natura-animale-lupo-natura selvaggia.jpg
- lupi/michael-mazzone-xvLRLLfP22o-unsplash.jpg
- lupi/lupo grigio eroe_animali.jpg
- lupi/lupo grigio_pollice.JPG.jpg
- lupi/lupo grigio.jpg
- lupi/Winter-wolf-snow_-_West_Virginia_-_ForestWander.jpg
- lupi/SRX_TRAPPING_WOLF_TRAPPING1.JPG.jpg
- lupi/lupo_eurasiano.JPG.jpg
- cani/n02106382_3756.jpg

Ho esaminato le informazioni relative alle immagini e ho riscontrato che le righe con problemi non contengono tutte le informazioni necessarie. Le voci si interrompono a metà della descrizione dell'immagine.
Ho esaminato la lunghezza delle informazioni relative alle immagini e ho scoperto che tutte le immagini corrotte hanno una lunghezza di caratteri pari esattamente a 524.287 (2^19 - 1).

Ho provato a modificare i parametri JSL creati da Query Builder, ma non sono riuscito a risolvere il problema del troncamento della lunghezza del testo. Non sono un esperto di SQL, quindi spero che la modifica di alcune di queste impostazioni possa risolvere il problema.
New SQL Query(
Connection(
"
ODBC:AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
"
),
QueryName( "dogs_v_wolves" ),
Select(
Distinct,
Column( "Picture", "t1" ),
Column( "Label", "t1" ),
Column( "File Path", "t1" ),
Column( "Short File Name", "t1" ),
Column( "FoldA", "t1" ),
Column( "FoldB", "t1" ),
Column( "FoldC", "t1" ),
Column( "Validation", "t1" )
),
From( Table( "dogs_v_wolves", Schema( "dogs_v_wolves" ), Alias( "t1" ) ) )
) << Run;
Ho provato a modificare i parametri JSL creati da Open Database Table, ma non sono riuscito a risolvere il problema del troncamento della lunghezza del testo. Ripeto, non sono un esperto di SQL, quindi spero che la modifica di alcune di queste impostazioni possa risolvere il mio problema.
Open Database(
"
AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
",
"SELECT * FROM dogs_v_wolves.dogs_v_wolves"
);
Per approfondire la situazione, ho creato uno script Python che esegue una query SQL e salva i risultati in un dataframe di pandas. Successivamente, ho creato un file JSL che esegue lo script Python e converte il dataframe di pandas in una tabella dati JMP.
Il file Python si chiama "sqlQuery.py" e contiene:
import pandas as pd
import sqlalchemy as db
engine = db.create_engine("postgresql+psycopg2://##connection information##")
query = """
SELECT DISTINCT *
FROM dogs_v_wolves.dogs_v_wolves;
"""
df = pd.read_sql_query(query, engine)
Il file JSL contiene:
Names Default To Here( 1 );
pythonFilePath = "sqlQuery.py";
Python Submit File( pythonFilePath );
dt = python get(df);
dt:Picture << set data type(expression);
Quando eseguo questo codice, la tabella dati contiene le stringhe di testo complete. Quando converto la colonna Immagine in un tipo di dati Espressione, le immagini vengono visualizzate correttamente.
Conclusioni
JMP sta scrivendo correttamente stringhe di testo di grandi dimensioni nel database.
JMP tronca le stringhe di testo di grandi dimensioni quando esegue query sul database utilizzando Query Builder e/o Open Database Table.
L'esecuzione di una query SQL al di fuori di JMP restituisce le stringhe di testo complete memorizzate nel database.
Desiderio
Vorrei poter sfruttare la praticità di Query Builder durante i miei progetti di elaborazione delle immagini.
Domanda
Esiste un'impostazione in JMP e/o JSL che posso modificare per abilitare l'interrogazione di valori stringa più lunghi?
Non avevo provato il connettore dati di PostgreSQL. Stavo usando solo la connessione ODBC integrata.
Seguendo il tuo consiglio, ho provato il connettore dati PostgreSQL e posso confermare che questo metodo risolve il problema del troncamento del testo lungo.
Sapevo che doveva esserci una soluzione semplice, ma non riuscivo a trovarla da solo.
Grazie per i consigli.
Potrebbe esserci una soluzione con ODBC, ma potrebbe richiedere un po' più di ricerca, dato che presumo che ciò influisca sui dati che ricevi.
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
e chiaramente non corrispondono al tuo 524287, quindi molto probabilmente viene sovrascritto da qualche altra parte (pur rimanendo troppo piccolo per il tuo caso d'uso).
@briancorcoran
È proprio lì che mi sono bloccato. Mi sono concentrato un po' troppo su parametri come:
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
Ma anche con l'aiuto di ChatGPT e Claude, non sono riuscito a trovare un parametro che influenzasse il limite di lunghezza della stringa di testo che ottenevo. Ho provato molte combinazioni di impostazioni consigliate dalle IA.
ChatGPT mi ha aiutato a creare il codice Python che ho usato per la query SQL di base che ho fornito nel mio post iniziale, ma non ha mai consigliato di usare il connettore dati PostgreSQL.
Anche se avrei potuto farlo con una mia query SQL in Python, mi sembrava di reinventare la ruota e non sarebbe mai stato facile come avrebbe dovuto essere.
Vuoi disattivare il recupero dei blocchi
Preferences(ODBC Disable Block Fetch(1))
Utilizzo di JSL prima di connettersi all'origine dati ODBC.
JMP utilizza il recupero a blocchi per migliorare le prestazioni durante l'importazione di dati da sorgenti ODBC.
Il caricamento a blocchi è un blocco di memoria contiguo N x N che viene popolato a ogni lettura dalla sorgente dati, anziché riga per riga. Con grandi quantità di dati di tipo carattere, questi dati verranno troncati a causa delle dimensioni del blocco. Attivando o disattivando questa opzione, JMP leggerà riga per riga e recupererà l'intera stringa.
Ho provato a seguire questo consiglio, ma purtroppo non sembra funzionare.
Ho eseguito il codice JSL e poi ho interrogato la mia tabella utilizzando File -> Connetti a -> ODBC -> Apri tabella del database.
Nonostante la modifica delle preferenze, continuo a riscontrare che le stringhe di testo lunghe vengono troncate a una lunghezza di 524.287 caratteri.
