SPSS Modeler 18.2まではフラットファイルの追加出力時に特に制限はありませんでしたが、18.2.2以降は2GBを超える場合に元のデータが削除されてしまう制限があります。
これは、Modeler18.2.2以降で使用しているICU4Cライブラリーに制限のためです。
この制限をPySparkの拡張ノードをつかって回避する方法を考えました。
- サンプルストリーム
- テスト環境
- Modeler 18.4
- Windows 11 64bit
1. PySpark拡張ノードを使った既存ファイルにレコード追加
「拡張のエクスポートノード」に以下を入力して実行します。
#ファイル名
filename='C:/temp/modelertmp2/2G.csv'
import spss.pyspark.runtime
ascontext = spss.pyspark.runtime.getContext()
import numpy
import pandas as pd
import csv
indf = ascontext.getSparkInputData()
df=indf.toPandas()
# Appendモードで出力。文字列はダブルクォートで囲む。index列とヘッダー行は出力しない。
df.to_csv(filename, quoting=csv.QUOTE_NONNUMERIC,mode='a', header=False, index=False)
以下で追加先のファイル名を指定しています。環境にあわせて修正してください。この部分をカスタムノード化してしまうのもよいと思います。
filename='C:/temp/modelertmp2/2G.csv'
2.テスト実行
「拡張のエクスポートノード」を実行すると1MB増えています。
最後の2行を確認すると確かに1MBのデータが一行追加されています。
3.制限の確認
既存ファイルにレコード追加の際にファイルサイズが2GBを超える場合に元データが削除される制限を確認してみます。
通常の「フラットファイルのエクスポートノード」で「レコード追加」してみます。
ファイルのサイズが2GBあったものが1MBになってしまいました。
なお、Modeler18.5ではメッセージが出力され実行が中断するように修正されています。
4. 日付型、タイムスタンプ型、時間型の注意
pandasのDataFrameにした際に日付型、タイムスタンプ型、時間型はうシリアル値になります。ですので、以下のような変換などをする必要があります。
df['ds'] = pd.to_datetime('1970/1/1') + pd.to_timedelta(df['ds'] , unit='days')
参照
エクスポート[フラットファイル]ノードの保存モード[レコード追加]のファイルサイズの制限について