私はこれまで、 クエリビルダーと「ファイル」→「接続先」→「ODBC」→「データベーステーブルを開く」を使用して、PostgreSQLデータベースからデータを取得してきました。
データベースから取得したテーブルには、大きなテキスト文字列を含む列があります。
テキスト文字列の長さが524,587文字(2^19 -1)を超えると、切り捨てられてしまいます。
JMPやJSLの設定で、より大きな文字列値をクエリできるように変更できる項目はありますか?
動機となった状況とデバッグ結果
Torch Deep Learningアドインの機能を調べています。
私はKaggleの「 犬対オオカミ」データセットをダウンロードしました。
JMPの「複数ファイルのインポート」機能を使用して、これらのファイルすべて(2000ファイル)を含むデータテーブルを作成しました。
私はJMPを使ってデータのクリーンアップ、応答列や検証列の作成などを行いました。
PostgreSQLデータベース、スキーマ、およびテーブルを作成しました。
JMPを使用してデータベーステーブルに接続し、犬とオオカミのデータを連結して、その情報をデータベースに保存しました。画像列は、new image( char to blob("...画像情報...") )を使用してデータベースにテキストとして保存されます。
データベース内のデータを確認しましたが、すべて想定どおりでした。
クエリビルダーを使用してデータベースに接続し、Dogs vs Wolves テーブル全体をクエリしました。
データテーブルに画像を表示させるために、Picture列のデータ型を文字型から式型に変換しました。2,000件のエントリのうち、1,986件は期待どおりに動作しました。14件の画像は正しく表示されません。これらのエントリには、次の画像が含まれます。
- wolves/wolf-names-e1528831052890.jpg
- オオカミ/オオカミの子.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
- オオカミ/ハイイロオオカミ.jpg
- wolves/Winter-wolf-snow_-_West_Virginia_-_ForestWander.jpg
- wolves/SRX_WOLF_TRAPPING1.JPG.jpg
- wolves/Eurasian_wolfJPG.jpg
- dogs/n02106382_3756.jpg

画像情報を確認したところ、問題のある行にはすべての情報が揃っていないことがわかりました。画像情報の途中で入力が途切れています。
画像情報の長さを確認したところ、破損した画像はすべて文字数が正確に524,287(2^19 - 1)であることがわかりました。

Query Builderで生成されたJSLパラメータを変更しようと試みましたが、テキストの長さの切り捨て問題を解決できませんでした。私はSQLの専門家ではないので、これらの設定をいくつか変更することで問題が解決することを期待しています。
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;
Open Database Tableで作成されたJSLパラメータを変更しようと試みましたが、テキストの長さの切り捨て問題を解決できませんでした。繰り返しになりますが、私はSQLの専門家ではないので、これらの設定の一部を変更することで問題が解決することを期待しています。
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"
);
状況をさらに詳しく調査するため、SQLクエリを実行し、その結果をpandasデータフレームに保存するPythonスクリプトを作成しました。次に、そのPythonスクリプトを実行し、pandasデータフレームをJMPデータテーブルに変換するJSLファイルを作成しました。
Pythonファイルの名前は「sqlQuery.py」で、内容は以下のとおりです。
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)
JSLファイルには以下が含まれます。
Names Default To Here( 1 );
pythonFilePath = "sqlQuery.py";
Python Submit File( pythonFilePath );
dt = python get(df);
dt:Picture << set data type(expression);
このコードを実行すると、データテーブルには全文文字列が含まれます。Picture列を式データ型に変換すると、画像が正しく表示されます。
結論
JMPは、大きなテキスト文字列をデータベースに正常に書き込んでいます。
JMPは、クエリビルダーやデータベーステーブルを開く機能を使用してデータベースからクエリを実行する際に、大きなテキスト文字列を切り捨ててしまいます。
JMPの外部でSQLクエリを実行すると、データベースに保存されている完全なテキスト文字列が返されます。
欲望
画像処理プロジェクトに取り組む際に、クエリビルダーの利便性を活用したいと考えています。
質問
JMPやJSLの設定で、より大きな文字列値をクエリできるように変更できる項目はありますか?
ODBCを使えば解決できるかもしれませんが、取得するデータに影響が出る可能性があるので、もう少し調べてみる必要があるかもしれません。
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
そして、それらは明らかにあなたの524287とは一致しないので、おそらくどこかで上書きされているのでしょう(それでもあなたの使用目的には小さすぎます)。
@briancorcoran
まさにそこで行き詰まってしまったんです。次のようなパラメータにこだわりすぎてしまったんです。
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
しかし、ChatGPTとClaudeが手助けしてくれたにもかかわらず、テキスト文字列の長さ制限に影響を与えるパラメータを見つけることができませんでした。AIが推奨する設定を様々な組み合わせで試してみましたが、うまくいきませんでした。
ChatGPTは、最初の投稿で示した基本的なSQLクエリに使用したPythonコードを作成するのに役立ちましたが、 PostgreSQLデータコネクタの使用を推奨したことはありませんでした。
自分でPythonのSQLクエリを作成すれば解決できるとしても、それは車輪の再発明のように感じられ、本来あるべきほど簡単にはいかないだろう。
ブロックフェッチをオフにしたい
Preferences(ODBC Disable Block Fetch(1))
ODBCデータソースに接続する前にJSLを使用する。
JMPは、ODBCソースからデータをインポートする際のパフォーマンスを向上させるために、ブロックフェッチングを使用します。
ブロックフェッチとは、データソースから読み込まれるたびに、行単位ではなく、N x N の連続したメモリブロックにデータが書き込まれる処理です。文字データ量が多い場合、ブロックサイズが大きすぎるため、データが切り詰められることがあります。この設定を切り替えると、JMP は行単位で読み込み、文字列全体を取得します。
この方法を試してみましたが、残念ながら効果がないようです。
JSLコードを実行した後、[ファイル] -> [接続先] -> [ODBC] -> [データベーステーブルを開く] を使用してテーブルをクエリしました。
設定を変更したにもかかわらず、長いテキスト文字列が524,287文字の長さに切り詰められてしまう問題が続いています。

はい、アップデートありがとうございます。また、各文字はUnicode文字(UTF-8)であることを覚えておいてください。
ODBCドライバがサイズを認識できない場合、JMPは4MBを使用します。
ウィッシュリストを更新してもらえますか?