Ich habe bisher den Abfrage-Generator und Datei->Verbinden mit->ODBC->Datenbanktabelle öffnen verwendet, um Daten aus einer PostgreSQL-Datenbank abzurufen.
Die Tabelle, die ich aus der Datenbank erhalte, enthält eine Spalte mit langen Textzeichenfolgen.
Meine Textzeichenketten werden abgeschnitten, sobald sie eine Länge von 524.587 (2^19 -1) überschreiten.
Gibt es in JMP und/oder JSL eine Einstellung, die ich ändern kann, um die Abfrage größerer Zeichenkettenwerte zu ermöglichen?
Motivierende Situation und Ergebnisse der Fehlersuche
Ich habe die Möglichkeiten des Torch Deep Learning Add-ins erkundet.
Ich habe einen Kaggle-Datensatz zum Thema „Hunde gegen Wölfe“ heruntergeladen.
Ich habe die JMP-Funktion „Mehrere Dateien importieren“ verwendet, um eine Datentabelle zu erstellen, die alle diese Dateien (2000 Dateien) enthält.
Ich habe JMP verwendet, um die Daten zu bereinigen, eine Antwortspalte und Validierungsspalten usw. zu erstellen...
Ich habe eine PostgreSQL-Datenbank, ein Schema und eine Tabelle erstellt.
Ich habe JMP verwendet, um eine Verbindung zur Datenbanktabelle herzustellen, meine Daten zum Thema „Hunde vs. Wölfe“ zusammenzuführen und die Informationen wieder in der Datenbank zu speichern. Die Spalte „Bild“ wird als Text in der Datenbank gespeichert, indem die Funktion `new image(char to blob("...die Bildinformationen...")` verwendet wird.
Ich habe die Daten in der Datenbank überprüft, und alles scheint wie erwartet zu sein.
Ich habe den Query Builder verwendet, um eine Verbindung zu meiner Datenbank herzustellen und die gesamte Tabelle „Hunde vs. Wölfe“ abzufragen.
Ich habe die Spalte „Bild“ vom Datentyp „Zeichenkette“ in „Ausdruck“ konvertiert, damit die Bilder in der Datentabelle angezeigt werden. Von den 2000 Einträgen funktionieren 1986 wie erwartet. 14 Bilder werden nicht korrekt angezeigt. Zu diesen Einträgen gehören die folgenden Bilder:
- wolves/wolf-names-e1528831052890.jpg
- wolves/wolf-cubs.jpg
- wolves/wolf-4191896__480.png
- wolves/pexels-photo-682375.jpeg
- wolves/pexels-photo-682361.jpeg
- wolves/nature-animal-wolf-wilderness.jpg
- wolves/michael-mazzone-xvLRLLfP22o-unsplash.jpg
- wolves/hero_gray_wolf_animals.jpg
- wolves/gray-wolf_thumbJPG.jpg
- wolves/gray-wolf.jpg
- wolves/Winter-wolf-snow_-_West_Virginia_-_ForestWander.jpg
- wolves/SRX_WOLF_TRAPPING1.JPG.jpg
- wolves/Eurasian_wolfJPG.jpg
- dogs/n02106382_3756.jpg

Ich habe die Bildinformationen überprüft und festgestellt, dass die Zeilen mit Problemen nicht alle Informationen enthalten. Die Einträge enden mitten im Bildinhalt.
Ich habe die Länge der Bildinformationen überprüft und festgestellt, dass die beschädigten Bilder alle eine Zeichenlänge von genau 524.287 aufweisen. (2^19 - 1).

Ich habe versucht, die vom Abfrage-Generator erstellten JSL-Parameter zu ändern, konnte das Problem mit der Textlängenbegrenzung aber nicht beheben. Da ich kein SQL-Experte bin, hoffe ich, dass sich mein Problem durch die Änderung einiger dieser Einstellungen lösen lässt.
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;
Ich habe versucht, die von Open Database Table erstellten JSL-Parameter zu ändern, konnte das Problem mit der abgeschnittenen Textlänge aber nicht beheben. Da ich kein SQL-Experte bin, hoffe ich, dass eine Änderung einiger dieser Einstellungen mein Problem lösen kann.
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"
);
Um die Situation genauer zu untersuchen, erstellte ich ein Python-Skript, das eine SQL-Abfrage ausführt und die Ergebnisse in einem Pandas-DataFrame speichert. Anschließend erstellte ich eine JSL-Datei, die das Python-Skript ausführt und den Pandas-DataFrame in eine JMP-Datentabelle konvertiert.
Die Python-Datei heißt "sqlQuery.py" und enthält Folgendes:
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)
Die JSL-Datei enthält:
Names Default To Here( 1 );
pythonFilePath = "sqlQuery.py";
Python Submit File( pythonFilePath );
dt = python get(df);
dt:Picture << set data type(expression);
Wenn ich diesen Code ausführe, enthält die Datentabelle die vollständigen Textzeichenfolgen. Wenn ich die Spalte „Bild“ in den Datentyp „Ausdruck“ konvertiere, werden die Bilder korrekt angezeigt.
Schlussfolgerungen
JMP schreibt erfolgreich große Textzeichenfolgen in die Datenbank.
JMP kürzt große Textzeichenfolgen beim Abfragen der Datenbank mit dem Abfrage-Generator und/oder der Funktion „Datenbanktabelle öffnen“.
Die Ausführung einer SQL-Abfrage außerhalb von JMP gibt die vollständigen Textzeichenfolgen zurück, die in der Datenbank gespeichert sind.
Wunsch
Ich möchte die Vorteile des Query Builders auch bei der Arbeit an meinen Bildverarbeitungsprojekten nutzen können.
Frage
Gibt es in JMP und/oder JSL eine Einstellung, die ich ändern kann, um die Abfrage größerer Zeichenkettenwerte zu ermöglichen?
Eine Lösung mit ODBC wäre möglich, aber dazu müsste man wohl noch etwas genauer hinschauen, da ich davon ausgehe, dass diese die Daten beeinflussen würden, die man erhält.
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
und sie stimmen eindeutig nicht mit Ihrer 524287 überein, daher wird sie höchstwahrscheinlich an anderer Stelle überschrieben (wobei sie für Ihren Anwendungsfall immer noch zu klein ist).
@briancorcoran
Genau da bin ich hängengeblieben. Ich habe mich etwas zu sehr auf Parameter wie die folgenden konzentriert:
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
Doch selbst mit der Hilfe von ChatGPT und Claude konnte ich keinen Parameter finden, der die von mir angezeigte maximale Textstringlänge beeinflusste. Ich habe zahlreiche von den KIs empfohlene Einstellungskombinationen ausprobiert.
ChatGPT hat mir zwar geholfen, den Python-Code zu erstellen, den ich für meine einfache SQL-Abfrage aus meinem ersten Beitrag verwendet habe, aber es hat nie empfohlen, den PostgreSQL Data Connector zu verwenden.
Auch wenn ich das mit einer eigenen Python-SQL-Abfrage lösen könnte, fühlt es sich an, als würde ich das Rad neu erfinden, und es wäre nie so einfach, wie es sein sollte.
Sie möchten das Block-Fetching deaktivieren.
Preferences(ODBC Disable Block Fetch(1))
JSL vor der Verbindung zur ODBC-Datenquelle verwenden.
JMP verwendet Block-Fetching, um die Leistung beim Importieren von Daten aus ODBC-Quellen zu verbessern.
Ein Blockabruf ist ein zusammenhängender Speicherblock der Größe N x N, der bei jedem Lesevorgang aus der Datenquelle anstatt zeilenweise gefüllt wird. Bei großen Mengen an Zeichendaten wird dieser aufgrund der Blockgröße abgeschnitten. Durch Umschalten dieser Einstellung liest JMP die Zeichenkette zeilenweise und erfasst sie vollständig.