Snowpark Migration Accelerator: Python用問題コード¶
SPRKPY1089¶
メッセージ: The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
カテゴリ: 警告
説明¶
Snowparkの pyspark.sql.readwriter.DataFrameWriter.options 値は異なる可能性があるため、動作が正しいことを確認するための検証が必要になる場合があります。
シナリオ¶
オプションがサポートされているかどうか、またはファイルの書き込みに使用される形式によって、いくつかのシナリオがあります。
シナリオ1¶
入力
以下は、メソッドオプションの使用例です。現在 サポートされている
sep
と nullValue
というオプションを追加しています。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(nullValue="myVal", sep=",").csv("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1089
を追加します。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.options(nullValue="myVal", sep=",").csv("some_path")
推奨される修正
Snowpark API はこれらのパラメーターをサポートしているため、唯一のアクションは移行後の動作を確認することです。サポートされるパラメーターについては、 等価表 をご参照ください。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.options(nullValue="myVal", sep=",").csv("some_path")
シナリオ2¶
入力
ここでは、シナリオはオプションの使用を示していますが、 ヘッダー
オプションを追加しています。これは サポートされていません
。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(header=True, sep=",").csv("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1089
を追加します。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.options(header=True, sep=",").csv("some_path")
推奨される修正
このシナリオでは、Snowpark 形式のタイプのオプション を評価し、ニーズに合わせて変更できるかどうかを確認することをお勧めします。また、変更後の動作も確認してください。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.csv("some_path")
シナリオ3¶
入力
このシナリオでは、 sep
オプションを追加します。これは、 サポートされて
おり、 JSON
メソッドを使用します。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(nullValue="myVal", sep=",").json("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1089
を追加します。
ノート: このシナリオは
PARQUET
にも当てはまります。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.options(nullValue="myVal", sep=",").json("some_path")
推奨される修正
ファイル形式 JSON
は、パラメーター sep
をサポートしていないため、Snowpark 形式のタイプのオプション を評価し、必要に応じて変更できるかどうかを確認することをお勧めします。また、変更後の動作も確認してください。
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
#EWI: SPRKPY1089 => The pyspark.sql.readwriter.DataFrameWriter.options values in Snowpark may be different, so required validation might be needed.
df.write.json("some_path")
その他の推奨事項¶
サポートされていない
パラメーターもあるため、等価表
を確認し、変換後の動作を確認することをお勧めします。等価表:
Snowparkはいくつかのパラメーターについて、 等価 のリストをサポートすることができます。
PySpark オプション |
SnowFlake オプション |
サポートされているファイル形式 |
説明 |
---|---|---|---|
SEP |
FIELD_DELIMITER |
CSV |
入力ファイルのフィールドを区切る、1バイトまたは複数バイトの文字。 |
LINESEP |
RECORD_DELIMITER |
CSV |
入力ファイルの記録を区切る、1つ以上の文字。 |
QUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
CSV |
文字列を囲むのに使用される文字。 |
NULLVALUE |
NULL_IF |
CSV |
SQL NULL との間の変換に使用される文字列。 |
DATEFORMAT |
DATE_FORMAT |
CSV |
ロードするデータファイルの日付値の形式を定義する文字列。 |
TIMESTAMPFORMAT |
TIMESTAMP_FORMAT |
CSV |
ロードするデータファイルのタイムスタンプ値の形式を定義する文字列。 |
使用されたパラメーターがリストにない場合、 API はエラーをスローします。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1088¶
メッセージ: The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
カテゴリ: 警告
説明¶
Snowparkの pyspark.sql.readwriter.DataFrameWriter.option 値は異なる可能性があるため、動作が正しいことを確認するために検証が必要になる場合があります。
シナリオ¶
サポートされているかどうかのオプションや、ファイルの書き込みに使用される形式によって、いくつかのシナリオがあります。
シナリオ1¶
入力
以下は、メソッドオプションの使用例です。現在 サポートされている
sep
というオプションを追加しています。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("sep", ",").csv("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1088
を追加します。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.option("sep", ",").csv("some_path")
推奨される修正
Snowpark API はこのパラメーターをサポートしているため、唯一のアクションは移行後の動作を確認することです。サポートされるパラメーターについては、 等価表 をご参照ください。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.option("sep", ",").csv("some_path")
シナリオ2¶
入力
ここでは、シナリオはオプションの使用を示していますが、 ヘッダー
オプションを追加しています。これは サポートされていません
。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("header", True).csv("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1088
を追加します。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.option("header", True).csv("some_path")
推奨される修正
このシナリオでは、Snowpark 形式のタイプのオプション を評価し、ニーズに合わせて変更できるかどうかを確認することをお勧めします。また、変更後の動作も確認してください。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.csv("some_path")
シナリオ3¶
入力
このシナリオでは、 sep
オプションを追加します。これは、 サポートされて
おり、 JSON
メソッドを使用します。
ノート: このシナリオは
PARQUET
にも当てはまります。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("sep", ",").json("some_path")
出力
ツールは、必須の検証であることを示す EWI SPRKPY1088
を追加します。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.option("sep", ",").json("some_path")
推奨される修正
ファイル形式 JSON
は、パラメーター sep
をサポートしていないため、Snowpark 形式のタイプのオプション を評価し、必要に応じて変更できるかどうかを確認することをお勧めします。また、変更後の動作も確認してください。
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
#EWI: SPRKPY1088 => The pyspark.sql.readwriter.DataFrameWriter.option values in Snowpark may be different, so required validation might be needed.
df.write.json("some_path")
その他の推奨事項¶
サポートされていない
パラメーターもあるため、等価表
を確認し、変換後の動作を確認することをお勧めします。等価表:
PySpark オプション |
SnowFlake オプション |
サポートされているファイル形式 |
説明 |
---|---|---|---|
SEP |
FIELD_DELIMITER |
CSV |
入力ファイルのフィールドを区切る、1バイトまたは複数バイトの文字。 |
LINESEP |
RECORD_DELIMITER |
CSV |
入力ファイルの記録を区切る、1つ以上の文字。 |
QUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
CSV |
文字列を囲むのに使用される文字。 |
NULLVALUE |
NULL_IF |
CSV |
SQL NULL との間の変換に使用される文字列。 |
DATEFORMAT |
DATE_FORMAT |
CSV |
ロードするデータファイルの日付値の形式を定義する文字列。 |
TIMESTAMPFORMAT |
TIMESTAMP_FORMAT |
CSV |
ロードするデータファイルのタイムスタンプ値の形式を定義する文字列。 |
使用されたパラメーターがリストにない場合、 API はエラーをスローします。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1011¶
メッセージ: pyspark.sql.dataframe.DataFrameStatFunctions.approxQuantile has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.dataframe.DataFrameStatFunctions.approxQuantile の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
Pysparkでは2つの異なるapproxQuantile関数が使用されることを理解しておくのは重要です。ここでは、 DataFrameStatFunctions approxQuantile バージョンを使用します。
import tempfile
from pyspark.sql import SparkSession, DataFrameStatFunctions
spark = SparkSession.builder.getOrCreate()
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Gain']
df = spark.createDataFrame(data, columns)
aprox_quantille = DataFrameStatFunctions(df).approxQuantile('Gain', [0.25, 0.5, 0.75], 0)
print(aprox_quantille)
出力
SMA は、approxQuantileが使用された行に EWI SPRKPY1011 を返すため、修正箇所を識別するのに使用できます。
import tempfile
from snowflake.snowpark import Session, DataFrameStatFunctions
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Gain']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1011 => pyspark.sql.dataframe.DataFrameStatFunctions.approxQuantile has a workaround, see documentation for more info
aprox_quantille = DataFrameStatFunctions(df).approxQuantile('Gain', [0.25, 0.5, 0.75], 0)
推奨される修正
Snowpark approxQuantile メソッドを使用できます。いくつかのパラメーターが一致しないため、手動での調整が必要です。出力コードの例では、推奨される修正は次のようになります。
from snowflake.snowpark import Session # remove DataFrameStatFunctions because is not required
...
df = spark.createDataFrame(data, columns)
aprox_quantille = df.stat.approx_quantile('Ammount', [0.25, 0.5, 0.75])
SnowPark には、 DataFrame.approxQuantileのrelativeErrorパラメーターが存在しません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1040¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.explode has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.explode 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.explode
関数の使用例です。この例では、 explode
関数を使用して、 numbers 列の配列項目ごとに1行を生成しています。
df = spark.createDataFrame([("Alice", [1, 2, 3]), ("Bob", [4, 5]), ("Charlie", [6, 7, 8, 9])], ["name", "numbers"])
exploded_df = df.select("name", explode(df.numbers).alias("number"))
出力
SMA は出力コードに EWI SPRKPY1040
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([("Alice", [1, 2, 3]), ("Bob", [4, 5]), ("Charlie", [6, 7, 8, 9])], ["name", "numbers"])
#EWI: SPRKPY1040 => pyspark.sql.functions.explode has a workaround, see documentation for more info
exploded_df = df.select("name", explode(df.numbers).alias("number"))
推奨される修正
回避策として、 explode
関数の拡張を提供する snowpark_extensions パッケージをインポートすることができます。
import snowpark_extensions
df = spark.createDataFrame([("Alice", [1, 2, 3]), ("Bob", [4, 5]), ("Charlie", [6, 7, 8, 9])], ["name", "numbers"])
exploded_df = df.select("name", explode(df.numbers).alias("number"))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1074¶
メッセージ: File has mixed indentation (spaces and tabs).
カテゴリ: 解析エラー。
説明¶
この問題は、ファイルにインデントが混在していることをツールが検出した場合に発生します。つまり、ファイルには空白とタブを組み合わせてインデントしたコード行があります。
シナリオ¶
入力
Pysparkでは、インデントレベルに空白とタブを混合することができます。
def foo():
x = 5 # spaces
y = 6 # tab
出力
SMA は、混合インデントマーカーを扱えません。Pythonコードファイル SMA でこれが検出されると、最初の行に EWI SPRKPY1074 が追加されます。
## EWI: SPRKPY1074 => File has mixed indentation (spaces and tabs).
## This file was not converted, so it is expected to still have references to the Spark API
def foo():
x = 5 # spaces
y = 6 # tabs
推奨される修正
解決策は、すべてのインデント記号を同じにすることです。
def foo():
x = 5 # tab
y = 6 # tab
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
¶
SPRKPY1025¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.ntile has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.ntile 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.ntile
関数の使用例です。この例では、 ntile
関数を使用して行を3つのバケットに分割しています。
df = spark.createDataFrame([("Alice", 50), ("Bob", 30), ("Charlie", 60), ("David", 90), ("Eve", 70), ("Frank", 40)], ["name", "score"])
windowSpec = Window.orderBy("score")
df_with_ntile = df.withColumn("bucket", ntile(3).over(windowSpec))
出力
SMA は出力コードに EWI SPRKPY1025
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([("Alice", 50), ("Bob", 30), ("Charlie", 60), ("David", 90), ("Eve", 70), ("Frank", 40)], ["name", "score"])
windowSpec = Window.orderBy("score")
#EWI: SPRKPY1025 => pyspark.sql.functions.ntile has a workaround, see documentation for more info
df_with_ntile = df.withColumn("bucket", ntile(3).over(windowSpec))
推奨される修正
Snowparkには同等の関数 ntile がありますが、引数は列にする必要があります。回避策として、 Snowflake.snowpark.functions.lit 関数を使用してリテラル引数を列に変換することができます。
df = spark.createDataFrame([("Alice", 50), ("Bob", 30), ("Charlie", 60), ("David", 90), ("Eve", 70), ("Frank", 40)], ["name", "score"])
windowSpec = Window.orderBy("score")
df_with_ntile = df.withColumn("bucket", ntile(lit(3)).over(windowSpec))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1087¶
メッセージ: The pyspark.sql.dataframe.DataFrame.writeTo function is not supported, but it has a workaround.
カテゴリ: 警告。
説明¶
pyspark.sql.dataframe.DataFrame.writeTo 関数はサポートされていません。回避策としては、代わりにSnowpark DataFrameWriter SaveAsTable メソッドを使用します。
シナリオ¶
入力
以下は、 pyspark.sql.dataframe.DataFrame.writeTo
関数の使用例です。データフレーム df
がテーブル名 Personal_info
に書き込まれます。
df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
schema=["FIRST_NAME", "LAST_NAME"])
df.writeTo("Personal_info")
出力
SMA は出力コードに EWI SPRKPY1087
を追加して、この関数がサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
schema=["FIRST_NAME", "LAST_NAME"])
#EWI: SPRKPY1087 => pyspark.sql.dataframe.DataFrame.writeTo is not supported, but it has a workaround.
df.writeTo("Personal_info")
推奨される修正
回避策としては、代わりにSnowpark DataFrameWriter SaveAsTable メソッドを使用します。
df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
schema=["FIRST_NAME", "LAST_NAME"])
df.write.saveAsTable("Personal_info")
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1035¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.reverse has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.reverse 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.reverse
関数の使用例です。この例では、 reverse
関数を使用して、 word 列の各文字列を反転させています。
df = spark.createDataFrame([("hello",), ("world",)], ["word"])
df_reversed = df.withColumn("reversed_word", reverse(df["word"]))
df_reversed = df.withColumn("reversed_word", reverse("word"))
出力
SMA は出力コードに EWI SPRKPY1035
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([("hello",), ("world",)], ["word"])
#EWI: SPRKPY1035 => pyspark.sql.functions.reverse has a workaround, see documentation for more info
df_reversed = df.withColumn("reversed_word", reverse(df["word"]))
#EWI: SPRKPY1035 => pyspark.sql.functions.reverse has a workaround, see documentation for more info
df_reversed = df.withColumn("reversed_word", reverse("word"))
推奨される修正
回避策として、 reverse
関数の拡張機能を提供する snowpark_extensions パッケージをインポートすることができます。
import snowpark_extensions
df = spark.createDataFrame([("hello",), ("world",)], ["word"])
df_reversed = df.withColumn("reversed_word", reverse(df["word"]))
df_reversed = df.withColumn("reversed_word", reverse("word"))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1064¶
メッセージ: The _ Spark element _ does not apply since snowflake uses snowpipe mechanism instead.
カテゴリ: 警告
説明¶
この問題は、pyspark.streamingライブラリのいずれかの要素の使用をツールが検出した場合に発生します。
pyspark.streaming.listener.StreamingListener。
シナリオ¶
入力
以下は、この EWI をトリガーする要素の1つを使った例です。
from pyspark.streaming.listener import StreamingListener
var = StreamingListener.Java
var.mro()
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.show()
出力
SMA は出力コードに EWI SPRKPY1064
を追加して、この関数が適用されないことを知らせます。
#EWI: SPRKPY1064 => The element does not apply since snowflake uses snowpipe mechanism instead.
var = StreamingListener.Java
var.mro()
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.show()
推奨される修正
SMA は、インポートステートメントを削除し、 Issues.csv インベントリに問題を追加し、Spark要素の使用を削除します。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.show()
その他の推奨事項¶
Snowpipe のドキュメントをチェックして、現在のシナリオとの適合性を確認します。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1050¶
メッセージ: pyspark.conf.SparkConf.set has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.conf.SparkConf.set の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 conf.set
を使って変数を設定する例です。
conf = SparkConf().setAppName('my_app')
conf.set("spark.storage.memoryFraction", "0.5")
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1050
を追加します。
conf = SparkConf().setAppName('my_app')
#EWI: SPRKPY1050 => pyspark.conf.SparkConf.set has a workaround, see documentation for more info
conf.set("spark.storage.memoryFraction", "0.5")
推奨される修正
SparkConf.setは、Pysparkでのみ使用される構成設定を設定するために使用され、Snowparkには適用されません。コードを削除したり、コメントしたりすることができます
#conf.set("spark.storage.memoryFraction", "0.5")
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1001¶
メッセージ : This code section has parsing errors
カテゴリ : 解析エラー。
説明¶
解析エラーは、Snowpark Migration Accelerator(SMA)がファイル内のコードを正しく読み取れなかったり、理解できなかったりした場合に報告されます(ファイルを正しく「解析」できませんでした)。この問題コードは、ファイルに1つ以上の解析エラーがある場合に表示されます。
シナリオ ¶
入力: EWI のメッセージは、コードが無効な構文を持つ場合に表示されます。
def foo():
x = %%%%%%1###1
出力: SMA は、解析エラーを見つけ、対応する EWI メッセージを解析エラーに追加してコメントします。
def foo():
x
## EWI: SPRKPY1101 => Unrecognized or invalid CODE STATEMENT @(2, 7). Last valid token was 'x' @(2, 5), failed token '=' @(2, 7)
## = %%%%%%1###1
その他の推奨事項 ¶
ファイルに有効なPythonコードが含まれているか確認します。(issues.csvファイルを使用して、この EWI コードが含まれるすべてのファイルを検索し、解析エラーのためにツールで処理されなかったファイルを特定できます。)解析エラーの多くは、コードの一部のみがツールに入力されるために発生します。有効な場合は、 SMA 内 の問題報告オプションを使って解析エラーが発生したことを報告してください。この問題を報告する際には、解析エラーの原因となったコード行を説明に含めます。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1021¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.last has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.last 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.last
関数の使用例です。この例では、 last
関数を使用して、各名前の最後の 値 を取得しています。
df = spark.createDataFrame([("Alice", 1), ("Bob", 2), ("Charlie", 3), ("Alice", 4), ("Bob", 5)], ["name", "value"])
df_grouped = df.groupBy("name").agg(last("value").alias("last_value"))
出力
SMA は出力コードに EWI SPRKPY1021
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([("Alice", 1), ("Bob", 2), ("Charlie", 3), ("Alice", 4), ("Bob", 5)], ["name", "value"])
#EWI: SPRKPY1021 => pyspark.sql.functions.last has a workaround, see documentation for more info
df_grouped = df.groupBy("name").agg(last("value").alias("last_value"))
推奨される修正
回避策として、Snowflake LAST_VALUE 関数を使用することができます。Snowparkからこの関数を呼び出すには、 snowflake.snowpark.functions.call_builtin 関数を使用し、第1引数に文字列 last_value
を、第2引数に対応する列を渡します。last
関数で列名を使用していた場合は、 call_builtin
関数を呼び出す際に列名に変換する必要があります。
df = spark.createDataFrame([("Alice", 1), ("Bob", 2), ("Charlie", 3), ("Alice", 4), ("Bob", 5)], ["name", "value"])
df_grouped = df.groupBy("name").agg(call_builtin("last_value", col("value")).alias("last_value"))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
説明: >- CSV、 JSON および PARQUET メソッド内の モード
パラメーターは 上書き
に変換されます
SPRKPY1070¶
メッセージ: The mode
argument is transformed to overwrite
, check the variable value and set the corresponding bool value.
カテゴリ: 警告
説明¶
以下が使用されている場合、
このツールは、パラメーター mode
を分析し、値が overwrite
かどうかを判断します。
シナリオ¶
シナリオ1¶
入力コード
このシナリオでは、ツールはmodeパラメーターが対応するbool値をセットできることを検出します。
df.write.csv(file_path, mode="overwrite")
出力コード:
SMA ツールはモードパラメーターを分析し、値が overwrite
であることを確定し、対応するブール値を設定します。
df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
推奨される修正
このシナリオでは、ツールが対応する変換を実行したため、推奨される修正はありません。
シナリオ2:
入力コード
このシナリオでは、ツールは値が overwrite
であることを確認できません。
df.write.csv(file_path, mode=myVal)
出力コード:
SMA は、「上書き」するようにモードパラメーターが変換されたことを示す EWI メッセージが追加されますが、これは、変数値を確認して正しいブール値を設定した方が良いことを知らせるためでもあります。
#EWI: SPRKPY1070 => The 'mode' argument is transformed to 'overwrite', check the variable value and set the corresponding bool value.
df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = myVal)
推奨される修正
パラメーター mode
の値を確認し、パラメーター overwrite
に正しい値を追加します。
df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1083¶
メッセージ: The pyspark.sql.readwriter.DataFrameWriter.save function is not supported.回避策としては、代わりにSnowpark DataFrameWriter copy_into_locationメソッドを使用します。
カテゴリ: 警告
説明¶
pyspark.sql.readwriter.DataFrameWriter.save 関数はサポートされていません。回避策としては、代わりにSnowpark DataFrameWriter メソッドを使用します。
シナリオ¶
このメソッド DataFrameWriter.save(path, format, mode, partitionBy, **options)
のSpark署名は、Snowparkには存在しません。したがって、load関数を使用すると、出力コードには EWI が追加されます。
シナリオ1¶
入力コード
以下は、 CSV
形式でデータを保存する例です。
path_csv_file = "/path/to/file.csv"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = my_session.createDataFrame(data, schema=["Name", "Age", "City"])
df.write.save(path_csv_file, format="csv")
df.write.save(path_csv_file, format="csv", mode="overwrite")
df.write.save(path_csv_file, format="csv", mode="overwrite", lineSep="\r\n", dateFormat="YYYY/MM/DD")
df.write.save(path_csv_file, format="csv", mode="overwrite", partitionBy="City", lineSep="\r\n", dateFormat="YYYY/MM/DD")
出力コード
ツールは出力コードにこの EWI SPRKPY1083
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_csv_file = "/path/to/file.csv"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = my_session.createDataFrame(data, schema=["Name", "Age", "City"])
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_csv_file, format="csv")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_csv_file, format="csv", mode="overwrite")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_csv_file, format="csv", mode="overwrite", lineSep="\r\n", dateFormat="YYYY/MM/DD")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_csv_file, format="csv", mode="overwrite", partitionBy="City", lineSep="\r\n", dateFormat="YYYY/MM/DD")
推奨される修正
回避策としては、代わりに Snowpark DataFrameWriter 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドを csv または copy_into_location メソッドに置き換えます。copy_into_location
メソッドを使用する場合は、file_format_typeパラメーター
で形式を指定する必要があります。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、仮ステージを作成し、そこにファイルを入れ、上記のメソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.csv", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.csv"
## Using csv method
df.write.csv(stage_file_path)
## Using copy_into_location method
df.write.copy_into_location(stage_file_path, file_format_type="csv")
mode
パラメーターの修正。Snowpark DataFrameWriter から mode 関数を以下のように使用します。
以下は、 overwrite
をパラメーターとする mode
メソッドをデイジーチェーンに追加する例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using csv method
df.write.mode("overwrite").csv(temp_stage)
## Using copy_into_location method
df.write.mode("overwrite").copy_into_location(temp_stage, file_format_type="csv")
partitionBy
パラメーターの修正。CSV
メソッドの partition_by パラメーターを以下のように使用します。
以下は、 CSV
メソッドの partition_by
パラメーターを使用した例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using csv method
df.write.csv(temp_stage, partition_by="City")
## Using copy_into_location method
df.write.copy_into_location(temp_stage, file_format_type="csv", partition_by="City")
options
パラメーターの修正。以下のように、
CSV
メソッドの format_type_options パラメーターを使用します。
SparkとSnowparkの間のオプションは同じではありません。この場合、 lineSep
と dateFormat
は RECORD_DELIMITER
と DATE_FORMAT
に置き換えられます。 その他の推奨事項 セクションには、すべての等価性の表があります。
以下は、 RECORD_DELIMITER
と DATE_FORMAT
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
optionsParam = {"RECORD_DELIMITER": "\r\n", "DATE_FORMAT": "YYYY/MM/DD"}
## Using csv method
df.write.csv(stage, format_type_options=optionsParam)
## Using copy_into_location method
df.write.csv(stage, file_format_type="csv", format_type_options=optionsParam)
シナリオ2¶
入力コード
以下は、 JSON
形式でデータを保存する例です。
path_json_file = "/path/to/file.json"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
df.write.save(path_json_file, format="json")
df.write.save(path_json_file, format="json", mode="overwrite")
df.write.save(path_json_file, format="json", mode="overwrite", dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3")
df.write.save(path_json_file, format="json", mode="overwrite", partitionBy="City", dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3")
出力コード
ツールは出力コードにこの EWI SPRKPY1083
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_json_file = "/path/to/file.json"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_json_file, format="json")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_json_file, format="json", mode="overwrite")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_json_file, format="json", mode="overwrite", dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_json_file, format="json", mode="overwrite", partitionBy="City", dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3")
推奨される修正
回避策としては、代わりに Snowpark DataFrameReader 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドを json または copy_into_location メソッドに置き換えます。copy_into_location
メソッドを使用する場合は、file_format_typeパラメーター
で形式を指定する必要があります。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、仮ステージを作成し、そこにファイルを入れ、上記のメソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.json", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.json"
## Using json method
df.write.json(stage_file_path)
## Using copy_into_location method
df.write.copy_into_location(stage_file_path, file_format_type="json")
mode
パラメーターの修正。Snowpark DataFrameWriter から mode 関数を以下のように使用します。
以下は、 overwrite
をパラメーターとする mode
メソッドをデイジーチェーンに追加する例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using json method
df.write.mode("overwrite").json(temp_stage)
## Using copy_into_location method
df.write.mode("overwrite").copy_into_location(temp_stage, file_format_type="json")
partitionBy
パラメーターの修正。CSV
メソッドの partition_by パラメーターを以下のように使用します。
以下は、 CSV
メソッドの partition_by
パラメーターを使用した例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using json method
df.write.json(temp_stage, partition_by="City")
## Using copy_into_location method
df.write.copy_into_location(temp_stage, file_format_type="json", partition_by="City")
options
パラメーターの修正。以下のように、
CSV
メソッドの format_type_options パラメーターを使用します。
SparkとSnowparkの間のオプションは同じではありません。この場合、 dateFormat
と timestampFormat
は DATE_FORMAT
と TIMESTAMP_FORMAT
に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。
以下は、 DATE_FORMAT
と TIMESTAMP_FORMAT
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
optionsParam = {"DATE_FORMAT": "YYYY/MM/DD", "TIMESTAMP_FORMAT": "YYYY-MM-DD HH24:MI:SS.FF3"}
## Using json method
df.write.json(stage, format_type_options=optionsParam)
## Using copy_into_location method
df.write.copy_into_location(stage, file_format_type="json", format_type_options=optionsParam)
シナリオ3¶
入力コード
以下は、 PARQUET
形式でデータを保存する例です。
path_parquet_file = "/path/to/file.parquet"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
df.write.save(path_parquet_file, format="parquet")
df.write.save(path_parquet_file, format="parquet", mode="overwrite")
df.write.save(path_parquet_file, format="parquet", mode="overwrite", pathGlobFilter="*.parquet")
df.write.save(path_parquet_file, format="parquet", mode="overwrite", partitionBy="City", pathGlobFilter="*.parquet")
出力コード
ツールは出力コードにこの EWI SPRKPY1083
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_parquet_file = "/path/to/file.parquet"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_parquet_file, format="parquet")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_parquet_file, format="parquet", mode="overwrite")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_parquet_file, format="parquet", mode="overwrite", pathGlobFilter="*.parquet")
#EWI: SPRKPY1083 => The pyspark.sql.readwriter.DataFrameWriter.save function is not supported. A workaround is to use Snowpark DataFrameWriter copy_into_location method instead.
df.write.save(path_parquet_file, format="parquet", mode="overwrite", partitionBy="City", pathGlobFilter="*.parquet")
推奨される修正
回避策としては、代わりに Snowpark DataFrameReader 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドを parquet または copy_into_location メソッドに置き換えます。copy_into_location
メソッドを使用する場合は、file_format_typeパラメーター
で形式を指定する必要があります。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、仮ステージを作成し、そこにファイルを入れ、上記のメソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.parquet", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.parquet"
## Using parquet method
df.write.parquet(stage_file_path)
## Using copy_into_location method
df.write.copy_into_location(stage, file_format_type="parquet")
mode
パラメーターの修正。Snowpark DataFrameWriter から mode 関数を以下のように使用します。
以下は、 overwrite
をパラメーターとする mode
メソッドをデイジーチェーンに追加する例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using parquet method
df.write.mode("overwrite").parquet(temp_stage)
## Using copy_into_location method
df.write.mode("overwrite").copy_into_location(stage, file_format_type="parquet")
partitionBy
パラメーターの修正。CSV
メソッドの partition_by パラメーターを以下のように使用します。
以下は、 parquet
メソッドの partition_by
パラメーターを使用した例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
## Using parquet method
df.write.parquet(temp_stage, partition_by="City")
## Using copy_into_location method
df.write.copy_into_location(stage, file_format_type="parquet", partition_by="City")
options
パラメーターの修正。以下のように、
CSV
メソッドの format_type_options パラメーターを使用します。
SparkとSnowparkの間のオプションは同じではありません。この場合、 pathGlobFilter
は PATTERN
に置き換えられています。 その他の推奨事項 セクションには、すべての等価値の表があります。
以下は、 PATTERN
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
optionsParam = {"PATTERN": "*.parquet"}
## Using parquet method
df.write.parquet(stage, format_type_options=optionsParam)
## Using copy_into_location method
df.write.copy_into_location(stage, file_format_type="parquet", format_type_options=optionsParam)
その他の推奨事項¶
SparkとSnowparkの間のオプションは同じではありませんが、マッピングが可能であることを考慮します。
Sparkオプション |
可能な値 |
Snowpark同等 |
説明 |
---|---|---|---|
header |
TrueまたはFalse |
SKIP_HEADER = 1 / SKIP_HEADER = 0 |
ファイルの最初の行を列の名前として使用します。 |
delimiter |
任意の1文字/複数文字のフィールドセパレーター |
FIELD_DELIMITER |
各列/フィールドのセパレーターとして単一/複数の文字を指定します。 |
sep |
任意の1文字フィールドセパレーター |
FIELD_DELIMITER |
各列/フィールドのセパレーターとして1文字を指定します。 |
encoding |
UTF-8、 UTF-16など。 |
ENCODING |
CSV ファイルを指定されたエンコードタイプでデコードします。デフォルトのエンコーディングは UTF-8です |
lineSep |
任意の1文字の行セパレーター |
RECORD_DELIMITER |
ファイルの解析に使用する行セパレーターを定義します。 |
pathGlobFilter |
ファイルパターン |
PATTERN |
パターンを定義して、そのパターンに一致するファイル名のファイルだけを読み込むようにします。 |
recursiveFileLookup |
TrueまたはFalse |
N/A |
再帰的にディレクトリをスキャンしてファイルを読み込みます。このオプションのデフォルト値はFalseです。 |
quote |
引用される1文字 |
FIELD_OPTIONALLY_ENCLOSED_BY |
区切り文字/セパレーターが値の一部となり得るフィールドを含むフィールド/列を引用します。この文字をquoteAllオプションと併用すると、すべてのフィールドを引用します。このオプションのデフォルト値は二重引用符(")です。 |
nullValue |
nullに置き換える文字列 |
NULL_IF |
データフレームの読み書きの際にnull値を文字列で置き換えます。 |
dateFormat |
有効な日付形式 |
DATE_FORMAT |
日付形式を示す文字列を定義します。デフォルトの形式はyyyy-MM-ddです。 |
timestampFormat |
有効なタイムスタンプ形式 |
TIMESTAMP_FORMAT |
タイムスタンプ形式を示す文字列を定義します。デフォルトの形式はyyyy-MM-dd 'T'HH:mm:ssです。 |
escape |
任意の1文字 |
ESCAPE |
デフォルトのエスケープ文字(\)を上書きする、単一の文字をエスケープ文字として設定します。 |
inferSchema |
TrueまたはFalse |
INFER_SCHEMA |
ファイルスキーマを自動検出します |
mergeSchema |
TrueまたはFalse |
N/A |
Snowflakeでは、infer_schemaがParquetファイル構造を決定するたびに発生するため、必要ありません。 |
modifiedBefore / modifiedAfter オプションについては、メタデータ列を使用し、
df.filter(METADATA_FILE_LAST_MODIFIED > 'some_date')
のようなフィルターを追加するとSnowflakeで同様の結果を得られます。詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1044¶
警告
この問題コードは、 Spark Conversion Core Version 2.4.0 以降 廃止 されています
メッセージ: pyspark.sql.functions.split has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.split の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
メソッドに渡されるパラメーターの量によって、いくつかのシナリオがあります。
シナリオ1¶
入力
以下は、関数 split
に str と pattern パラメーターのみがある場合の例です。
F.split('col', '\\|')
出力
ツールは、回避策があることを示す EWI SPRKPY1044
を表示します。
#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|')
推奨される修正
回避策として、パターンパラメーターを指定して関数 Snowflake.snowpark.functions.lit を呼び出し、それをsplitに送信することができます。
F.split('col', lit('\\|'))
## the result of lit will be sent to the split function
シナリオ2¶
入力
以下は、関数 split
に str、パターン、制限 のパラメーターがある場合の別の例です。
F.split('col', '\\|', 2)
出力
ツールは、回避策があることを示す EWI SPRKPY1044
を表示します。
#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|', 2)
推奨される修正
このシナリオはサポートされていません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1015¶
メッセージ: pyspark.sql.functions.atanh has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.atanh の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、pysparkは pyspark.sql.functions.atanh を使用してデータフレームのatanhを計算します。
from pyspark.sql import SparkSession
from pyspark.sql.functions import atanh
spark = SparkSession.builder.getOrCreate()
data = [['V1', 0.14],
['V2', 0.32],
['V3', 0.4],
['V4', -0.36]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_result = df.withColumn("atanh_value", atanh(df["value"]))
出力
SMA は、atanhが使用された行に EWI SPRKPY1015 を返すため、修正が必要な箇所を識別するのに使用できます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 0.14],
['V2', 0.32],
['V3', 0.4],
['V4', -0.36]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1015 => pyspark.sql.functions.atanh has a workaround, see documentation for more info
df_result = df.withColumn("atanh_value", atanh(df["value"]))
推奨される修正
直接的な「atanh」の実装はありませんが、代わりに「call_function」を使用することができます。「atanh」を最初のパラメーターとして使用し、colNameを2番目のパラメーターとして使用します。
import snowflake.snowpark as snowpark
from snowflake.snowpark import Session
from snowflake.snowpark.functions import call_function, col
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 0.14],
['V2', 0.32],
['V3', 0.4],
['V4', -0.36]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_result = df.select(call_function('atanh', col('value')))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1005¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ : pyspark.conf.SparkConf is not required
カテゴリ : 警告。
説明¶
この問題は、不要な pyspark.conf.SparkConf の使用をツールが検出した場合に発生します。
シナリオ¶
入力
SparkConf はパラメーターなし、またはloadDefaultsとともに呼び出すことができます。
from pyspark import SparkConf
my_conf = SparkConf(loadDefaults=True)
出力
いずれの場合(パラメーターがある場合とない場合)でも、 SMA は Snowpark Session.builder オブジェクトを作成します。
#EWI: SPRKPY1005 => pyspark.conf.SparkConf is not required
#from pyspark import SparkConf
pass
#EWI: SPRKPY1005 => pyspark.conf.SparkConf is not required
my_conf = Session.builder.configs({"user" : "my_user", "password" : "my_password", "account" : "my_account", "role" : "my_role", "warehouse" : "my_warehouse", "database" : "my_database", "schema" : "my_schema"}).create()
その他の推奨事項¶
これは不要なパラメーターが削除され、警告コメントが挿入されたものです。ユーザーからの追加アクションは必要ありません。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1054¶
メッセージ: pyspark.sql.readwriter.DataFrameReader.format is not supported.
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader. 形式にSnowparkでサポートされていない引数がある場合に発生します。
シナリオ¶
読み込む形式のタイプによって、いくつかのシナリオがあります。それは、 サポートされている
形式か、 サポートされていない
形式かです。
シナリオ1¶
入力
このツールは、読み込む形式のタイプを分析します。
Csv
JSON
Parquet
Orc
以下の例は、 Csv
の値を渡したときに、 format
メソッドをツールがどのように変換するかを示しています。
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df1 = spark.read.format('csv').load('/path/to/file')
出力
このツールは、 format
メソッドを Csv
メソッド呼び出しに変換します。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
df1 = spark.read.csv('/path/to/file')
推奨される修正
この場合、ツールは EWI を表示しません。
シナリオ2¶
入力
以下の例は、 Jdbc
値を渡すときに、 format
メソッドをツールがどのように変換するかを示しています。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
df2 = spark.read.format('jdbc') \
.option("driver", "com.mysql.cj.jdbc.Driver") \
.option("url", "jdbc:mysql://localhost:3306/emp") \
.option("dbtable", "employee") \
.option("user", "root") \
.option("password", "root") \
.load()
出力
ツールは、値「jdbc」がサポートされていないことを示す EWI SPRKPY1054
を表示します。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
#EWI: SPRKPY1054 => pyspark.sql.readwriter.DataFrameReader.format with argument value "jdbc" is not supported.
#EWI: SPRKPY1002 => pyspark.sql.readwriter.DataFrameReader.load is not supported
df2 = spark.read.format('jdbc') \
.option("driver", "com.mysql.cj.jdbc.Driver") \
.option("url", "jdbc:mysql://localhost:3306/emp") \
.option("dbtable", "employee") \
.option("user", "root") \
.option("password", "root") \
.load()
推奨される修正
サポートされていない
シナリオについては、読み込もうとしているファイルに依存するため、特定の修正はありません。
シナリオ3¶
入力
以下の例は、 CSV
を渡す歳にツールが format
メソッドを変換する方法を示していますが、代わりに変数を使用しています。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
myFormat = 'csv'
df3 = spark.read.format(myFormat).load('/path/to/file')
出力
ツールはランタイムで変数の値を決定できないため、値""がサポートされていないことを示す EWI SPRKPY1054
を表示します。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
myFormat = 'csv'
#EWI: SPRKPY1054 => pyspark.sql.readwriter.DataFrameReader.format with argument value "" is not supported.
#EWI: SPRKPY1002 => pyspark.sql.readwriter.DataFrameReader.load is not supported
df3 = spark.read.format(myFormat).load('/path/to/file')
推奨される修正
回避策として、変数の値をチェックし、 format
呼び出しに文字列として追加することができます。
その他の推奨事項¶
Snowparkロケーションは、 Snowflakeステージ を使用したクラウドロケーションのみを受け付けます。
Snowparkがサポートするメソッドのドキュメントは、以下の ドキュメント にあります
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1060¶
メッセージ: The authentication mechanism is connection.json (template provided).
カテゴリ: 警告。
説明¶
この問題は、 pyspark.conf.SparkConf の使用をツールが検出した場合に発生します。
シナリオ¶
入力
Snowparkでは認証コードが異なるため、ツールは使用を削除し、代わりに 接続構成ファイル(connection.json) を作成します。
from pyspark import SparkConf
my_conf = SparkConf(loadDefaults=True)
出力
ツールは、認証コードが異なることを示す EWI SPRKPY1060
を追加します。
#EWI: SPRKPY1002 => pyspark.conf.SparkConf is not supported
#EWI: SPRKPY1060 => The authentication mechanism is connection.json (template provided).
#my_conf = Session.builder.configs(connection_parameter).getOrCreate()
my_conf = None
推奨される修正
接続を作成するには、 connection.json
ファイルに情報を入力する必要があります。
{
"user": "<USER>",
"password": "<PASSWORD>",
"account": "<ACCOUNT>",
"role": "<ROLE>",
"warehouse": "<WAREHOUSE>",
"database": "<DATABASE>",
"schema": "<SCHEMA>"
}
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1031¶
警告
この問題コードは、 Spark Conversion Core 2.7.0 以降 廃止 されています
メッセージ: pyspark.sql.column.Column.contains has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.column.Column.contains 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.column.column.contains
関数の使用例です。この例では、 contains
関数を使用して、「City」列に部分文字列「New」が含まれる行をフィルターしています。
df = spark.createDataFrame([("Alice", "New York"), ("Bob", "Los Angeles"), ("Charlie", "Chicago")], ["Name", "City"])
df_filtered = df.filter(col("City").contains("New"))
出力
SMA は出力コードに EWI SPRKPY1031
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([("Alice", "New York"), ("Bob", "Los Angeles"), ("Charlie", "Chicago")], ["Name", "City"])
#EWI: SPRKPY1031 => pyspark.sql.column.Column.contains has a workaround, see documentation for more info
df_filtered = df.filter(col("City").contains("New"))
推奨される修正
回避策として、 Snowflake.snowpark.functions.contains 関数を使用し、列を第1引数に、検索する要素を第2引数に渡します。検索する要素がリテラル値の場合は、 lit
関数を使用して列式に変換する必要があります。
from snowflake.snowpark import functions as f
df = spark.createDataFrame([("Alice", "New York"), ("Bob", "Los Angeles"), ("Charlie", "Chicago")], ["Name", "City"])
df_filtered = df.filter(f.contains(col("City"), f.lit("New")))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1020¶
メッセージ: pyspark.sql.functions.instr has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.instr の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
pyspark instrの基本的な使用例は以下のとおりです。
from pyspark.sql import SparkSession
from pyspark.sql.functions import instr
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([('abcd',)], ['test',])
df.select(instr(df.test, 'cd').alias('result')).collect()
出力:
SMA はinstrが使われている行に EWI SPRKPY1020 を返すため、修正箇所を識別するのに使用できます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
df = spark.createDataFrame([('abcd',)], ['test',])
#EWI: SPRKPY1020 => pyspark.sql.functions.instr has a workaround, see documentation for more info
df.select(instr(df.test, 'cd').alias('result')).collect()
推奨される修正
charindex 関数を使用し、最初の2つのパラメーターの順序を変更することにより、手動で変更する必要があります。
import snowflake.snowpark as snowpark
from snowflake.snowpark import Session
from snowflake.snowpark.functions import charindex, lit
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
df = spark.createDataFrame([('abcd',)], ['test',])
df.select(charindex(lit('cd'), df.test).as_('result')).show()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1071¶
メッセージ: The function pyspark.rdd.RDD.getNumPartitions is not required in Snowpark.そのため、参照はすべて削除する必要があります。
カテゴリ: 警告
説明¶
この問題は、 pyspark.rdd.RDD.getNumPartitions 関数の使用をツールが検出した場合に発生します。Snowflakeはマイクロパーティショニングメカニズムを使用しているため、この関数を使用する必要はありません。
シナリオ¶
入力
getNumPartitions は、 RDD 上のパーティションの数を返します。
df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
print(df.getNumPartitions())
出力
ツールはこの EWI を追加して、 getNumPartitions が不要であることを知らせます。
df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
#EWI: SPRKPY1071 => The getNumPartitions are not required in Snowpark. So, you should remove all references.
print(df.getNumPartitions())
推奨される修正
この関数の使用をすべて削除します。
df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
その他の推奨事項¶
サポートの詳細については、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。`
SPRKPY1082¶
メッセージ: The pyspark.sql.readwriter.DataFrameReader.load function is not supported.回避策としては、代わりにSnowpark DataFrameReader 形式固有のメソッド(avro csv、json、orc、parquet)を使用します。パスのパラメーターは、ステージロケーションにする必要があります。
カテゴリ: 警告
説明¶
pyspark.sql.readwriter.DataFrameReader.load 関数はサポートされていません。回避策としては、代わりにSnowpark DataFrameReader メソッドを使用します。
シナリオ¶
このメソッド DataFrameReader.load(path, format, schema, **options)
のSpark署名は、Snowparkには存在しません。したがって、load関数を使用すると、出力コードには EWI が追加されます。
シナリオ1¶
入力
以下は、 CSV
ソースからデータを読み込もうとした場合の例です。
path_csv_file = "/path/to/file.csv"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.load(path_csv_file, "csv").show()
my_session.read.load(path_csv_file, "csv", schema=schemaParam).show()
my_session.read.load(path_csv_file, "csv", schema=schemaParam, lineSep="\r\n", dateFormat="YYYY/MM/DD").show()
出力
SMA は EWI SPRKPY1082
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_csv_file = "/path/to/file.csv"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_csv_file, "csv").show()
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_csv_file, "csv", schema=schemaParam).show()
#EWI: The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_csv_file, "csv", schema=schemaParam, lineSep="\r\n", dateFormat="YYYY/MM/DD").show()
推奨される修正
回避策としては、代わりに Snowpark DataFrameReader 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドをcsv
メソッドに置き換えます。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、テンポラルステージを作成し、そこにファイルを入れ、 CSV
メソッドを呼び出す例です。
path_csv_file = "/path/to/file.csv"
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.csv", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.csv"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.csv(stage_file_path).show()
schema
パラメーターの修正。スキーマは スキーマ 関数を使用して以下のように設定できます。
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).csv(temp_stage)
options
パラメーターの修正。
SparkとSnowparkの間の オプション は同じではありません。この場合、 lineSep
と dateFormat
は RECORD_DELIMITER
と DATE_FORMAT
に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。
以下は、 RECORD_DELIMITER
と DATE_FORMAT
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
optionsParam = {"RECORD_DELIMITER": "\r\n", "DATE_FORMAT": "YYYY/MM/DD"}
df = my_session.read.options(optionsParam).csv(stage)
シナリオ2¶
入力
以下は、 JSON
ソースからデータを読み込もうとした場合の例です。
path_json_file = "/path/to/file.json"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.load(path_json_file, "json").show()
my_session.read.load(path_json_file, "json", schema=schemaParam).show()
my_session.read.load(path_json_file, "json", schema=schemaParam, dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3").show()
出力
SMA は EWI SPRKPY1082
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_json_file = "/path/to/file.json"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_json_file, "json").show()
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_json_file, "json", schema=schemaParam).show()
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_json_file, "json", schema=schemaParam, dateFormat="YYYY/MM/DD", timestampFormat="YYYY-MM-DD HH24:MI:SS.FF3").show()
推奨される修正
回避策としては、代わりに Snowpark DataFrameReader 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドをjson
メソッドに置き換えます。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、テンポラルステージを作成し、そこにファイルを入れ、 JSON
メソッドを呼び出す例です。
path_json_file = "/path/to/file.json"
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.json", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.json"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.json(stage_file_path).show()
schema
パラメーターの修正。スキーマは スキーマ 関数を使用して以下のように設定できます。
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).json(temp_stage)
options
パラメーターの修正。
SparkとSnowparkの間の オプション は同じではありません。この場合、 dateFormat
と timestampFormat
は DATE_FORMAT
と TIMESTAMP_FORMAT
に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。
以下は、 DATE_FORMAT
と TIMESTAMP_FORMAT
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
optionsParam = {"DATE_FORMAT": "YYYY/MM/DD", "TIMESTAMP_FORMAT": "YYYY-MM-DD HH24:MI:SS.FF3"}
df = Session.read.options(optionsParam).json(stage)
シナリオ3¶
入力
以下は、 PARQUET
ソースからデータを読み込もうとした場合の例です。
path_parquet_file = "/path/to/file.parquet"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.load(path_parquet_file, "parquet").show()
my_session.read.load(path_parquet_file, "parquet", schema=schemaParam).show()
my_session.read.load(path_parquet_file, "parquet", schema=schemaParam, pathGlobFilter="*.parquet").show()
出力
SMA は EWI SPRKPY1082
を追加して、この関数がSnowparkでサポートされていないことを知らせますが、回避策があります。
path_parquet_file = "/path/to/file.parquet"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_parquet_file, "parquet").show()
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_parquet_file, "parquet", schema=schemaParam).show()
#EWI: SPRKPY1082 => The pyspark.sql.readwriter.DataFrameReader.load function is not supported. A workaround is to use Snowpark DataFrameReader format specific method instead (avro csv, json, orc, parquet). The path parameter should be a stage location.
my_session.read.load(path_parquet_file, "parquet", schema=schemaParam, pathGlobFilter="*.parquet").show()
推奨される修正
回避策としては、代わりに Snowpark DataFrameReader 関数を使用します。
path
およびformat
パラメーターの修正。load
メソッドをparquet
メソッドに置き換えます。最初のパラメーター
path
は、 Snowpark と同等のステージにある必要があります。
以下は、テンポラルステージを作成し、そこにファイルを入れ、 PARQUET
メソッドを呼び出す例です。
path_parquet_file = "/path/to/file.parquet"
## Stage creation
temp_stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
my_session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}').show()
my_session.file.put(f"file:///path/to/file.parquet", f"@{temp_stage}")
stage_file_path = f"{temp_stage}file.parquet"
schemaParam = StructType([
StructField("Name", StringType(), True),
StructField("Superhero", StringType(), True)
])
my_session.read.parquet(stage_file_path).show()
schema
パラメーターの修正。スキーマは スキーマ 関数を使用して以下のように設定できます。
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).parquet(temp_stage)
options
パラメーターの修正。
SparkとSnowparkの間の オプション は同じではありません。この場合、 pathGlobFilter
は PATTERN
に置き換えられています。 その他の推奨事項 セクションには、すべての等価値の表があります。
以下は、 PATTERN
でディクショナリを作成し、そのディクショナリを使って options
メソッドを呼び出す例です。
optionsParam = {"PATTERN": "*.parquet"}
df = Session.read.options(optionsParam).parquet(stage)
その他の推奨事項¶
SparkとSnowparkの間のオプションは同じではありませんが、マッピングが可能であることを考慮します。
Sparkオプション |
可能な値 |
Snowpark同等 |
説明 |
---|---|---|---|
header |
TrueまたはFalse |
SKIP_HEADER = 1 / SKIP_HEADER = 0 |
ファイルの最初の行を列の名前として使用します。 |
delimiter |
任意の1文字/複数文字のフィールドセパレーター |
FIELD_DELIMITER |
各列/フィールドのセパレーターとして単一/複数の文字を指定します。 |
sep |
任意の1文字フィールドセパレーター |
FIELD_DELIMITER |
各列/フィールドのセパレーターとして1文字を指定します。 |
encoding |
UTF-8、 UTF-16など。 |
ENCODING |
CSV ファイルを指定されたエンコードタイプでデコードします。デフォルトのエンコーディングは UTF-8です |
lineSep |
任意の1文字の行セパレーター |
RECORD_DELIMITER |
ファイルの解析に使用する行セパレーターを定義します。 |
pathGlobFilter |
ファイルパターン |
PATTERN |
パターンを定義して、そのパターンに一致するファイル名のファイルだけを読み込むようにします。 |
recursiveFileLookup |
TrueまたはFalse |
N/A |
再帰的にディレクトリをスキャンしてファイルを読み込みます。このオプションのデフォルト値はFalseです。 |
quote |
引用される1文字 |
FIELD_OPTIONALLY_ENCLOSED_BY |
区切り文字/セパレーターが値の一部となり得るフィールドを含むフィールド/列を引用します。この文字をquoteAllオプションと併用すると、すべてのフィールドを引用します。このオプションのデフォルト値は二重引用符(")です。 |
nullValue |
nullに置き換える文字列 |
NULL_IF |
データフレームの読み書きの際にnull値を文字列で置き換えます。 |
dateFormat |
有効な日付形式 |
DATE_FORMAT |
日付形式を示す文字列を定義します。デフォルトの形式はyyyy-MM-ddです。 |
timestampFormat |
有効なタイムスタンプ形式 |
TIMESTAMP_FORMAT |
タイムスタンプ形式を示す文字列を定義します。デフォルトの形式はyyyy-MM-dd 'T'HH:mm:ssです。 |
escape |
任意の1文字 |
ESCAPE |
デフォルトのエスケープ文字(\)を上書きする、単一の文字をエスケープ文字として設定します。 |
inferSchema |
TrueまたはFalse |
INFER_SCHEMA |
ファイルスキーマを自動検出します |
mergeSchema |
TrueまたはFalse |
N/A |
Snowflakeでは、infer_schemaがParquetファイル構造を決定するたびに発生するため、必要ありません。 |
modifiedBefore / modifiedAfter オプションについては、メタデータ列を使用し、
df.filter(METADATA_FILE_LAST_MODIFIED > 'some_date')
のようなフィルターを追加するとSnowflakeで同様の結果を得られます。詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1045¶
メッセージ: pyspark.sql.functions.map_values has a workaround
カテゴリ: 警告。
説明¶
この関数は、 マップ/ディクショナリ9キー/値) を含む列から値のリストを抽出するために使用されます。
この問題は、 pyspark.sql.functions.map_values の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 map_values
メソッドの使用例です。
df = spark.createDataFrame(
[(1, {'Apple': 'Fruit', 'Potato': 'Vegetable'})],
("id", "a_map"))
df.select(map_values("a_map")).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1045
を追加します。
df = spark.createDataFrame(
[(1, {'Apple': 'Fruit', 'Potato': 'Vegetable'})],
("id", "a_map"))
#EWI: SPRKPY1045 => pyspark.sql.functions.map_values has a workaround, see documentation for more info
df.select(map_values("a_map")).show()
推奨される修正
回避策として、 udf を作成して列の値を取得することができます。以下の例では、udfを作成し、 F.map_values
に割り当て、それを利用する方法を示しています。
from snowflake.snowpark import functions as F
from snowflake.snowpark.types import ArrayType, MapType
map_values_udf=None
def map_values(map):
global map_values_udf
if not map_values_udf:
def _map_values(map: dict)->list:
return list(map.values())
map_values_udf = F.udf(_map_values,return_type=ArrayType(),input_types=[MapType()],name="map_values",is_permanent=False,replace=True)
return map_values_udf(map)
F.map_values = map_values
df.select(map_values(colDict))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1014¶
メッセージ: pyspark.sql.functions.asinh has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.asinh の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、pysparkは pyspark.sql.functions.asinh を使用してデータフレームのasinhを計算します。
from pyspark.sql import SparkSession
from pyspark.sql.functions import asinh
spark = SparkSession.builder.getOrCreate()
data = [['V1', 3.0],
['V2', 60.0],
['V3', 14.0],
['V4', 3.1]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_result = df.withColumn("asinh_value", asinh(df["value"]))
出力
SMA はasinhが使われている行に EWI SPRKPY1014 を返すため、修正箇所を識別するのに使用できます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 3.0],
['V2', 60.0],
['V3', 14.0],
['V4', 3.1]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1014 => pyspark.sql.functions.asinh has a workaround, see documentation for more info
df_result = df.withColumn("asinh_value", asinh(df["value"]))
推奨される修正
直接の「asinh」実装はありませんが、代わりに「call_function」を使用できます。「asinh」を最初のパラメーターとして使い、colNameを2番目のパラメーターとして使います。
import snowflake.snowpark as snowpark
from snowflake.snowpark import Session
from snowflake.snowpark.functions import call_function, col
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 3.0],
['V2', 60.0],
['V3', 14.0],
['V4', 3.1]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_result = df.select(call_function('asinh', col('value')))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1004¶
メッセージ : The symbol table could not be loaded.
カテゴリ : 解析エラー。
説明¶
この問題は、ツールの実行プロセスで予期せぬエラーが発生した場合に表示されます。記号テーブルがロードできないため、ツールは評価または変換プロセスを開始できません。
その他の推奨事項 ¶
これはソースコード自体のエラーとは考えにくく、むしろツールがソースコードを処理する方法のエラーです。最良の解決方法は、 SMA サポートチーム に連絡することです。sma-support@snowflake.com にメールでお問い合わせください。
詳細なサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1055¶
メッセージ: pyspark.sql.readwriter.DataFrameReader.option key value is not supported.
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.option
キー値が SnowFlake でサポートされていない場合に発生します。
このツールは、オプションコールのパラメーターを分析し、メソッド(CSV または JSON または PARQUET)によって、キー値にSnowparkでの等価値があるかないかを判断します。すべてのパラメーターに等価値がある場合、ツールは EWI を追加せず、キー値を等価値に置き換えます。そうでない場合、ツールは EWI を追加します。
等価性のリスト:
CSV の等価性:
Sparkオプションキー |
Snowparkの等価性 |
---|---|
sep |
FIELD_DELIMITER |
header |
PARSE_HEADER |
lineSep |
RECORD_DELIMITER |
pathGlobFilter |
PATTERN |
quote |
FIELD_OPTIONALLY_ENCLOSED_BY |
nullValue |
NULL_IF |
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
inferSchema |
INFER_SCHEMA |
delimiter |
FIELD_DELIMITER |
JSON の等価性:
Sparkオプションキー |
Snowparkの等価性 |
---|---|
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
pathGlobFilter |
PATTERN |
PARQUET の等価性:
Sparkオプションキー |
Snowparkの等価性 |
---|---|
pathGlobFilter |
PATTERN |
上記の表にないキーオプションは、Snowparkではサポートされていないか、同等のものがありません。この場合、ツールは EWI にパラメーター情報を追加し、チェーンから削除します。
シナリオ¶
以下のシナリオは、 CSV、 JSON、 PARQUET に適用されます。
option
メソッドで使われるキーの値によって、いくつかのシナリオがあります。
シナリオ1¶
入力
以下は、 等価キー
を使用した オプション
呼び出しの例です。
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
## CSV example:
spark.read.option("header", True).csv(csv_file_path)
## Json example:
spark.read.option("dateFormat", "dd-MM-yyyy").json(json_file_path)
## Parquet example:
spark.read.option("pathGlobFilter", "*.parquet").parquet(parquet_file_path)
出力
ツールは、キーを正しい等価値で変換します。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
## CSV example:
spark.read.option("PARSE_HEADER", True).csv(csv_file_path)
## Json example:
spark.read.option("DATE_FORMAT", "dd-MM-yyyy").json(json_file_path)
## Parquet example:
spark.read.option("PATTERN", "*.parquet").parquet(parquet_file_path)
推奨される修正
ツールはキーの値を変換するため、修正する必要はありません。
シナリオ2¶
入力
以下は、 非等価キー
を使用した オプション
呼び出しの例です。
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
## CSV example:
spark.read.option("anotherKeyValue", "myVal").csv(csv_file_path)
## Json example:
spark.read.option("anotherKeyValue", "myVal").json(json_file_path)
## Parquet example:
spark.read.option("anotherKeyValue", "myVal").parquet(parquet_file_path)
出力
ツールは、キーがサポートされていないことを示す EWI SPRKPY1055
を追加し、 オプション
呼び出しを削除します。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
## CSV example:
#EWI: SPRKPY1055 => pyspark.sql.readwriter.DataFrameReader.option with key value "anotherKeyValue" is not supported.
spark.read.csv(csv_file_path)
## Json example:
#EWI: SPRKPY1055 => pyspark.sql.readwriter.DataFrameReader.option with key value "anotherKeyValue" is not supported.
spark.read.json(json_file_path)
## Parquet example:
#EWI: SPRKPY1055 => pyspark.sql.readwriter.DataFrameReader.option with key value "anotherKeyValue" is not supported.
spark.read.parquet(parquet_file_path)
推奨される修正
変換後の動作を確認することをお勧めします。
その他の推奨事項¶
非等価パラメーターが存在する場合は、変換後の動作を確認することをお勧めします。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1061¶
メッセージ: Snowpark does not support unix_timestamp functions
カテゴリ: 警告
説明¶
Snowparkでは、最初のパラメーターは必須です。この問題は、ツールがパラメーターのない pyspark.sql.functions.unix_timestamp の使用を検出した場合に発生します。
シナリオ¶
入力
以下は、 unix_timestamp
メソッドをパラメーターなしで呼び出す例です。
data = [["2015-04-08", "10"],["2015-04-10", "15"]]
df = spark.createDataFrame(data, ['dt', 'val'])
df.select(unix_timestamp()).show()
出力
この関数 unix_timestamp(e: ColumnOrName, fmt: Optional["Column"] = None)
のSnowpark署名には、最初のパラメーターが必須であることがわかります。
ツールはこの EWI SPRKPY1061
を追加して、パラメーターのない関数unix_timestampはSnowparkでサポートされていないことを知らせます。
data = [["2015-04-08", "10"],["2015-04-10", "15"]]
df = spark.createDataFrame(data, ['dt', 'val'])
#EWI: SPRKPY1061 => Snowpark does not support unix_timestamp functions with no parameters. See documentation for more info.
df.select(unix_timestamp()).show()
推奨される修正
回避策として、少なくともタイムスタンプ文字列の名前または列を追加することができます。
data = [["2015-04-08", "10"],["2015-04-10", "15"]]
df = spark.createDataFrame(data, ["dt", "val"])
df.select(unix_timestamp("dt")).show()
その他の推奨事項¶
また、 current_timestamp() を最初のパラメーターとして追加することもできます。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1030¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.session.SparkSession.Builder.appName has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.session.SparkSession.Builder.appName 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.session.SparkSession.Builder.appName
関数の使用例です。この例では、 appName
関数を使用して、アプリケーション名として MyApp を設定しています。
session = SparkSession.builder.appName("MyApp").getOrCreate()
出力
SMA は出力コードに EWI SPRKPY1030
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
#EWI: SPRKPY1030 => pyspark.sql.session.SparkSession.Builder.appName has a workaround, see documentation for more info
session = Session.builder.appName("MyApp").getOrCreate()
推奨される修正
回避策として、 appName
関数の拡張機能を提供する snowpark_extensions パッケージをインポートすることができます。
import snowpark_extensions
session = SessionBuilder.appName("MyApp").getOrCreate()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1010¶
メッセージ: pyspark.sql.dataframe.DataFrame.checkpoint has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.dataframe.DataFrame.checkpoint の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
PySpark では、チェックポイントは、データフレームの論理計画を切り捨てるために使用されます。これは、理論プランの拡大を回避するためです。
import tempfile
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Score']
df = spark.createDataFrame(data, columns)
with tempfile.TemporaryDirectory() as d:
spark.sparkContext.setCheckpointDir("/tmp/bb")
df.checkpoint(False)
出力
SMA は、approxQuantileが使用された行に EWI SPRKPY1010 を返すため、修正箇所を識別するのに使用できます。setCheckpointDir もサポートされていないこがマークされますが、修正にチェックポイントされたディレクトリは必要ありません。
import tempfile
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Score']
df = spark.createDataFrame(data, columns)
with tempfile.TemporaryDirectory() as d:
#EWI: SPRKPY1002 => pyspark.context.SparkContext.setCheckpointDir is not supported
spark.setCheckpointDir("/tmp/bb")
#EWI: SPRKPY1010 => pyspark.sql.dataframe.DataFrame.checkpoint has a workaround, see documentation for more info
df.checkpoint(False)
推奨される修正
Snowparkは明示的なチェックポイントを不要にします。Snowparkは、Snowflakeクエリ最適化エンジンによって最適化された SQL に基づく操作で動作するため、一方的な計算や制御不能になる論理プランが不要になるからです。
しかし、データフレームに対する計算結果を永続化することが必要になる場合もあります。このシナリオでは、データフレームを SnowflakeテーブルまたはSnowflake仮テーブル に書き込むことで、結果を具体化します。
永続的なテーブルや計算結果を使用することで、セッション終了後でもいつでもアクセスすることができます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Score']
df = spark.createDataFrame(data, columns)
df.write.save_as_table("my_table", table_type="temporary") # Save the dataframe into Snowflake table "my_table".
df2 = Session.table("my_table") # Now I can access the stored result quering the table "my_table"
別の方法として、仮テーブルを使用すると、セッション終了後にテーブルが削除されるという利点があります。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 300000],
['Q2', 60000],
['Q3', 500002],
['Q4', 130000]]
columns = ['Quarter', 'Score']
df = spark.createDataFrame(data, columns)
df.write.save_as_table("my_temp_table", table_type="temporary") # Save the dataframe into Snowflake table "my_temp_table".
df2 = Session.table("my_temp_table") # Now I can access the stored result quering the table "my_temp_table"
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1101¶
カテゴリ¶
解析エラー。
説明¶
ツールが解析エラーを認識すると、そのエラーから回復しようとし、次の行で処理を続行します。これらの場合、行にエラーとコメントが表示されます。
この例では、スペースとタブの不一致エラーがどのように処理されるかを示しています。
入力コード
def foo():
x = 5 # Spaces
y = 6 # Tab
def foo2():
x=6
y=7
出力コード
def foo():
x = 5 # Spaces
## EWI: SPRKPY1101 => Unrecognized or invalid CODE STATEMENT @(3, 2). Last valid token was '5' @(2, 9), failed token 'y' @(3, 2)
## y = 6 # Tab
def foo2():
x=6
y=7
推奨事項¶
コメントされている行を修正してみてください。
サポートの詳細については、 sma-support@snowflake.com にメールでお問い合わせください。Snowflakeとサポート契約を結んでいる場合は、担当のセールスエンジニアにご連絡ください。
SPRKPY1041¶
警告
この問題コードは、 Spark Conversion Core Version 2.9.0 以降 廃止 されています
メッセージ: pyspark.sql.functions.explode_outer has a workaround
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.explode_outer の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、 explode_outer というメソッドを選択呼出しで使用しています。
df = spark.createDataFrame(
[(1, ["foo", "bar"], {"x": 1.0}),
(2, [], {}),
(3, None, None)],
("id", "an_array", "a_map")
)
df.select("id", "an_array", explode_outer("a_map")).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1041
を追加します。
df = spark.createDataFrame(
[(1, ["foo", "bar"], {"x": 1.0}),
(2, [], {}),
(3, None, None)],
("id", "an_array", "a_map")
)
#EWI: SPRKPY1041 => pyspark.sql.functions.explode_outer has a workaround, see documentation for more info
df.select("id", "an_array", explode_outer("a_map")).show()
推奨される修正
回避策として、 explode_outer
関数のヘルパーを含むsnowpark_extensionsパッケージをインポートすることができます。
import snowpark_extensions
df = spark.createDataFrame(
[(1, ["foo", "bar"], {"x": 1.0}),
(2, [], {}),
(3, None, None)],
("id", "an_array", "a_map")
)
df.select("id", "an_array", explode_outer("a_map")).show()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1075¶
カテゴリ
警告。
説明¶
スキーマに基づいたフィルターや検証が必要な場合は、何らかのロジックを導入することが必要になる場合があります。
例¶
入力
df.select(from_json(df.value, Schema))
df.select(from_json(schema=Schema, col=df.value))
df.select(from_json(df.value, Schema, option))
出力
#EWI: SPRKPY1075 => The parse_json does not apply schema validation, if you need to filter/validate based on schema you might need to introduce some logic.
df.select(parse_json(df.value))
#EWI: SPRKPY1075 => The parse_json does not apply schema validation, if you need to filter/validate based on schema you might need to introduce some logic.
df.select(parse_json(df.value))
#EWI: SPRKPY1075 => The parse_json does not apply schema validation, if you need to filter/validate based on schema you might need to introduce some logic.
df.select(parse_json(df.value))
from_json関数では、スキーマは推論のために渡されるのではなく、検証のために使われます。この例をご参照ください。
data = [
('{"name": "John", "age": 30, "city": "New York"}',),
('{"name": "Jane", "age": "25", "city": "San Francisco"}',)
]
df = spark.createDataFrame(data, ["json_str"])
例1: データ型を強制し、列名を変更する。
## Parse JSON column with schema
parsed_df = df.withColumn("parsed_json", from_json(col("json_str"), schema))
parsed_df.show(truncate=False)
## +------------------------------------------------------+---------------------------+
## |json_str |parsed_json |
## +------------------------------------------------------+---------------------------+
## |{"name": "John", "age": 30, "city": "New York"} |{John, 30, New York} |
## |{"name": "Jane", "age": "25", "city": "San Francisco"}|{Jane, null, San Francisco}|
## +------------------------------------------------------+---------------------------+
## notice that values outside of the schema were dropped and columns not matched are returned as null
例2: 特定の列を選択する。
## Define a schema with only the columns we want to use
partial_schema = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
## Parse JSON column with partial schema
partial_df = df.withColumn("parsed_json", from_json(col("json_str"), partial_schema))
partial_df.show(truncate=False)
## +------------------------------------------------------+---------------------+
## |json_str |parsed_json |
## +------------------------------------------------------+---------------------+
## |{"name": "John", "age": 30, "city": "New York"} |{John, New York} |
## |{"name": "Jane", "age": "25", "city": "San Francisco"}|{Jane, San Francisco}|
## +------------------------------------------------------+---------------------+
## there is also an automatic filtering
推奨事項¶
サポートの詳細については、 sma-support@snowflake.com にメールでお問い合わせください。Snowflakeとサポート契約を結んでいる場合は、セールスエンジニアにご連絡ください。必要なサポートにご案内します。
SPRKPY1024¶
メッセージ: pyspark.sql.functions.log2 has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.log2 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.log2
関数の使用例です。この例では、 log2
関数を使用して、 value 列のbase-2対数を計算しています。
df = spark.createDataFrame([(1,), (2,), (4,), (8,), (16,)], ["value"])
df_with_log2 = df.withColumn("log2_value", log2(df["value"]))
出力
SMA は出力コードに EWI SPRKPY1024
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(1,), (2,), (4,), (8,), (16,)], ["value"])
#EWI: SPRKPY1024 => pyspark.sql.functions.log2 has a workaround, see documentation for more info
df_with_log2 = df.withColumn("log2_value", log2(df["value"]))
推奨される修正
回避策として、リテラル値 2
をベースとして渡して、 Snowflake.snowpark.functions.log 関数を使用することができます。
df = session.createDataFrame([(1,), (2,), (4,), (8,), (16,)], ["value"])
df_with_log2 = df.withColumn("log2_value", log(2, df["value"]))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1086¶
メッセージ: pyspark.ml.linalg.VectorUDT is not supported.
カテゴリ: 警告
説明¶
pyspark.ml.linalg.VectorUDT はサポートされていません。
シナリオ¶
入力コード
VectorUDT は、 DataFrame のベクトル列を表すデータ型です。
data = [
(1, Vectors.dense([10.0, 20.0])),
(2, Vectors.dense([25.0, 30.0])),
(3, Vectors.dense([50.0, 60.0]))
]
schema = StructType([
StructField("Id", IntegerType(), True),
StructField("VectorCol", VectorUDT(), True),
])
df = SparkSession.createDataFrame(data, schema=schema)
出力コード
ツールは出力コードにこの EWI SPRKPY1086
を追加して、この関数がSnowparkでサポートされていないことを知らせます。
data = [
(1, Vectors.dense([10.0, 20.0])),
(2, Vectors.dense([25.0, 30.0])),
(3, Vectors.dense([50.0, 60.0]))
]
#EWI: SPRKPY1086 => The pyspark.ml.linalg.VectorUDT function is not supported.
schema = StructType([
StructField("Id", IntegerType(), True),
StructField("VectorCol", VectorUDT(), True),
])
df = spark.createDataFrame(data, schema=schema)
推奨される修正
pyspark.ml.linalg.VectorUDT には推奨される修正がありません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1034¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.desc has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.desc 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
pyspark.sql.functions.desc
関数は、パラメーターとして列オブジェクトまたは文字列としての列名を取ります。どちらのシナリオもSnowparkではサポートされていないため、この EWI が生成されます。
シナリオ1¶
入力
以下は、 pyspark.sql.functions.desc
関数の使用例で、パラメーターとして列オブジェクトを取ります。
df.orderBy(desc(col))
出力
SMA は出力コードに EWI SPRKPY1034
を追加して、列オブジェクトパラメーターのある desc
関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc(col))
推奨される修正
回避策として、列パラメーターから Snowflake.snowpark.Column.desc 関数を呼び出すことができます。
df.orderBy(col.desc())
シナリオ2¶
入力
以下は、 pyspark.sql.functions.desc
関数の使用例で、パラメーターとして列名を取ります。
df.orderBy(desc("colName"))
出力
SMA は出力コードに EWI SPRKPY1034
を追加して、列名パラメーターのある desc
関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc("colName"))
推奨される修正
回避策として、 snowflake.snowpark.functions.col 関数を使用して文字列パラメーターを列オブジェクトに変換し、 snowflake.snowpark.Column.desc 関数を呼び出すことができます。
df.orderBy(col("colName").desc())
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1065¶
メッセージ: The pyspark.context.SparkContext.broadcast does not apply since snowflake use data-clustering mechanism to compute the data.
カテゴリ: 警告
説明¶
この問題は、要素 pyspark.context.SparkContext.broadcast の使用をツールが検出した場合に発生します。これは、Snowflakeの データクラスタリング の使用により不要となります。
入力コード
この例ではブロードキャスト変数が作成され、この変数によってすべてのノードでデータをより効率的に共有することができます。
sc = SparkContext(conf=conf_spark)
mapping = {1: 10001, 2: 10002}
bc = sc.broadcast(mapping)
出力コード
SMA は、ブロードキャストが不要であることを示す EWI メッセージを追加します。
sc = conf_spark
mapping = {1: 10001, 2: 10002}
#EWI: SPRKPY1065 => The element does not apply since snowflake use data-clustering mechanism to compute the data.
bc = sc.broadcast(mapping)
推奨される修正
使用されているすべてのpyspark.context.SparkContext.broadcastを削除します。
sc = conf_spark
mapping = {1: 10001, 2: 10002}
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1051¶
警告
この問題コードは、 Spark Conversion Core Version 2.4.0 以降 廃止 されています
メッセージ: pyspark.sql.session.SparkSession.Builder.master has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.session.SparkSession.Builder.master の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 builder.master
というメソッドの使用例で、Spark Master URL を1コアでローカルに接続するように設定しています。
spark = SparkSession.builder.master("local[1]")
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1051
を追加します。
#EWI: SPRKPY1051 => pyspark.sql.session.SparkSession.Builder.master has a workaround, see documentation for more info
spark = Session.builder.master("local[1]")
推奨される修正
pyspark.sql.session.SparkSession.Builder.master
は、Sparkクラスターの設定に使用します。SnowparkはSparkクラスターを使用しないため、コードを削除またはコメントすることができます。
## spark = Session.builder.master("local[1]")
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1000¶
メッセージ: Source project spark-core version is xx.xx:xx.x.x, the spark-core version supported by snowpark is 2.12:3.1.2 so there may be functional differences between the existing mappings.
カテゴリ: 警告。
説明¶
この問題は、ソースコードのPysparkバージョンがサポートされていない場合に発生します。これは、既存のマッピングの間に機能差がある可能性があることを意味します。
その他の推奨事項¶
Snowparkとの互換性のために SMA によってスキャンされたpysparkのバージョンは2.12から3.1.2です。この範囲外のバージョンを使用している場合、ツールは一貫性のない結果を出す可能性があります。スキャンするソースコードのバージョンを変更することができます。
詳細なサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1081¶
この問題コードは、 Spark Conversion Core 4.12.0 以降 廃止 されています
メッセージ: pyspark.sql.readwriter.DataFrameWriter.partitionBy has a workaround.
カテゴリ: 警告
説明¶
Pyspark.sql.readwriter.DataFrameWriter.partitionBy 関数はサポートされていません。回避策としては、 Snowparkのcopy_into_location を使用します。詳細については、ドキュメントをご参照ください。
シナリオ¶
入力
このコードは、 FIRST_NAME
列のユニークな値ごとに個別のディレクトリを作成します。データは同じですが、列によって異なるディレクトリに保存されます。
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.partitionBy("FIRST_NAME").csv("/home/data")
このコードは、 FIRST_NAME
列のユニークな値ごとに個別のディレクトリを作成します。データは同じですが、列によって異なるディレクトリに保存されます。
出力コード
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
#EWI: SPRKPY1081 => The partitionBy function is not supported, but you can instead use copy_into_location as workaround. See the documentation for more info.
df.write.partitionBy("FIRST_NAME").csv("/home/data", format_type_options = dict(compression = "None"))
推奨される修正
Snowparkでは、 copy_into_location にpartitionBy関数の代わりに使用できるpartition_byパラメーターがありますが、次の例に示すように、手動での調整が必要になります。
Sparkコード:
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.partitionBy("FIRST_NAME").csv("/home/data")
手動で調整したSnowparkコード:
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.copy_into_location(location=temp_stage, partition_by=col("FIRST_NAME"), file_format_type="csv", format_type_options={"COMPRESSION": "NONE"}, header=True)
copy_into_location には以下のパラメーターがあります。
location: Snowparkロケーションは、 Snowflakeステージ を使用するクラウドロケーションのみを受け入れます。
partition_by: これは列名または SQL 式です。したがって、colまたはsql_exprを使用して列または SQL に変換する必要があります。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1072¶
メッセージ: The use of StorageLevel is not required in Snowpark.
カテゴリ: 警告。
説明¶
この問題は、ストレージレベルを設定する「フラグ」のような働きをする StorageLevel クラスが使用されていることをツールが検出した場合に発生します。Snowflakeはストレージを制御するため、この関数を使用する必要はありません。
その他の推奨事項¶
この関数の使用をすべて削除します。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1023¶
メッセージ: pyspark.sql.functions.log1p has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.log1p 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.log1p
関数の使用例です。この例では、 log1p
関数を使用して、 value 列の自然対数を計算しています。
df = spark.createDataFrame([(0,), (1,), (10,), (100,)], ["value"])
df_with_log1p = df.withColumn("log1p_value", log1p(df["value"]))
出力
SMA は出力コードに EWI SPRKPY1023
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(0,), (1,), (10,), (100,)], ["value"])
#EWI: SPRKPY1023 => pyspark.sql.functions.log1p has a workaround, see documentation for more info
df_with_log1p = df.withColumn("log1p_value", log1p(df["value"]))
推奨される修正
回避策として、 ln
という文字列を第1引数に渡し、 1
を第2引数に加えることで、 call_function 関数を使用することができます。
df = spark.createDataFrame([(0,), (1,), (10,), (100,)], ["value"])
df_with_log1p = df.withColumn("log1p_value", call_function("ln", lit(1) + df["value"]))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1017¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
pyspark.sql.functions.date_addには回避策があります。
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.date_add の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、date_addを使用して、dataframe dfの現在の日付から5日後の日付を計算しています。
col = df.select(date_add(df.colName, 5))
出力
SMA は、date_addが使用された行に EWI SPRKPY1017 を返すため、修正箇所を識別するのに使用できます。
#EWI: SPRKPY1017 => pyspark.sql.functions.date_add has a workaround, see documentation for more info
col = df.select(date_add(df.colName, 5))
推奨される修正
date_add (およびエイリアスdateAdd)関数の実装を含むSnowflake.snowpark.functionsをインポートします。
from snowflake.snowpark.functions import date_add
col = df.select(date_add(df.dt, 1))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1046¶
警告
この問題コードは、 Spark Conversion Core Version 2.1.22 以降 廃止 されています
メッセージ: pyspark.sql.functions.monotonically_increasing_id has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.monotonically_increasing_id の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 monotonically_increasing_id
メソッドの使用例です。
from pyspark.sql import functions as F
spark.range(0, 10, 1, 2).select(F.monotonically_increasing_id()).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1046
を追加します。
from pyspark.sql import functions as F
#EWI: SPRKPY1046 => pyspark.sql.functions.monotonically_increasing_id has a workaround, see documentation for more info
spark.range(0, 10, 1, 2).select(F.monotonically_increasing_id()).show()
推奨される修正
ツールバージョンを更新します。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1056¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.readwriter.DataFrameReader.option argument _ <argument_name> _ is not a literal and can't be evaluated
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.option 関数の引数のキーまたは値がリテラル値(変数など)でない場合に発生します。SMA はソースコードの静的分析を行うため、引数の内容を評価することはできません。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.readwriter.DataFrameReader.option
関数の使用例です。
my_value = ...
my_option = ...
df1 = spark.read.option("dateFormat", my_value).format("csv").load('filename.csv')
df2 = spark.read.option(my_option, "false").format("csv").load('filename.csv')
出力
SMA は出力コードに EWI SPRKPY1056
を追加して、この関数の引数がリテラル値ではないため、 SMA で評価できなかったことを知らせます。
my_value = ...
my_option = ...
#EWI: SPRKPY1056 => pyspark.sql.readwriter.DataFrameReader.option argument "dateFormat" is not a literal and can't be evaluated
df1 = spark.read.option("dateFormat", my_value).format("csv").load('filename.csv')
#EWI: SPRKPY1056 => pyspark.sql.readwriter.DataFrameReader.option argument key is not a literal and can't be evaluated
df2 = spark.read.option(my_option, "false").format("csv").load('filename.csv')
推奨される修正
SMA が引数を評価することができなかったとしても、Snowparkによってサポートされていないわけではありません。引数の値が有効であり、Snowparkで等価であることを ドキュメント で確認してください。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1007¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ : pyspark.sql.context.SQLContext is not required
カテゴリ : 警告。
説明¶
この問題は、不要な pyspark.sql.context.SQLContext の使用をツールが検出した場合に発生します。
シナリオ¶
入力
ここでは、 SparkContext のオーバーロードを変更した例を示します。
from pyspark import SQLContext
my_sc1 = SQLContext(myMaster, myAppName, mySparkHome, myPyFiles, myEnvironment, myBatctSize, mySerializer, my_conf1)
my_sc2 = SQLContext(conf=my_conf2)
my_sc3 = SQLContext()
出力
出力コードでは、pyspark.SQLContext の行がコメントされ、シナリオが構成への参照に置き換えられています。Sparkのプロパティを含んでいる変数my_sc1とmy_sc2は、不要な場合やコードを修正するために変更される場合があります。
#EWI: SPRKPY1007 => pyspark.sql.context.SQLContext is not required
#from pyspark import SQLContext
pass
#EWI: SPRKPY1007 => pyspark.sql.context.SQLContext is not required
sql_context1 = my_sc1
#EWI: SPRKPY1007 => pyspark.sql.context.SQLContext is not required
sql_context2 = my_sc2
その他の推奨事項¶
これは不要なパラメーターであるため、ソースコードに警告コメントを挿入して削除します。ユーザーからのアクションはありません。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1033¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.asc has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.asc 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
pyspark.sql.functions.asc
関数は、パラメーターとして列オブジェクトまたは文字列としての列名を取ります。どちらのシナリオもSnowparkではサポートされていないため、この EWI が生成されます。
シナリオ1¶
入力
以下は、 pyspark.sql.functions.asc
関数の使用例で、パラメーターとして列オブジェクトを取ります。
df.orderBy(asc(col))
出力
SMA は出力コードに EWI SPRKPY1033
を追加して、列オブジェクトパラメーターのある asc
関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc(col))
推奨される修正
回避策として、列パラメーターから snowflake.snowpark.Column.asc 関数を呼び出すことができます。
df.orderBy(col.asc())
シナリオ2¶
入力
以下は、 pyspark.sql.functions.asc
関数の使用例で、パラメーターとして列名を取ります。
df.orderBy(asc("colName"))
出力
SMA は出力コードに EWI SPRKPY1033
を追加して、列名パラメーターのある asc
関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc("colName"))
推奨される修正
回避策として、 snowflake.snowpark.functions.col 関数を使用して文字列パラメーターを列オブジェクトに変換し、 snowflake.snowpark.Column.asc 関数を呼び出すことができます。
df.orderBy(col("colName").asc())
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1062¶
メッセージ: Snowpark does not support GroupedData.pivot without parameter "values".
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.group.GroupedData.pivot 関数が「value」パラメーター (pivotする値のリスト) なしで使用されていることを SMA が検出すると発生します。
現時点では、Snowpark Pythonのピボット関数は、ピボットする値のリストを明示的に指定する必要があります。
シナリオ¶
シナリオ1¶
入力
SMA は、パターン dataFrame.groupBy("columnX").pivot("columnY")
に一致する式を検出し、ピボットには values パラメーターがありません。
df.groupBy("date").pivot("category").sum("amount")
出力
SMA は、「values」パラメーターのないピボット関数がサポートされていないことを示す EWI メッセージを追加します。
さらに、ピボット関数の2番目のパラメーターとして、列に翻訳される値のリストを計算するリスト読解を追加します。この操作は大容量のデータでは効率が悪いため、明示的に値を指定することをお勧めします。
#EWI: SPRKPY1062 => pyspark.sql.group.GroupedData.pivot without parameter 'values' is not supported. See documentation for more info.
df.groupBy("date").pivot("category", [v[0] for v in df.select("category").distinct().limit(10000).collect()]]).sum("amount")
推奨される修正
このシナリオでは、 SMA は、ピボット関数の2番目のパラメーターに、列に翻訳される値のリストを計算するリスト読解を追加します。
df = spark.createDataFrame([
Row(category="Client_ID", date=2012, amount=10000),
Row(category="Client_name", date=2012, amount=20000)
])
df.groupBy("date").pivot("category", ["dotNET", "Java"]).sum("amount")
シナリオ2¶
入力
SMA は、パターン dataFrame.groupBy("columnX").pivot("columnY")
に一致する式を検出できず、ピボットには values パラメーターがありません。
df1.union(df2).groupBy("date").pivot("category").sum("amount")
出力
SMA は、「values」パラメーターのないピボット関数がサポートされていないことを示す EWI メッセージを追加します。
#EWI: SPRKPY1062 => pyspark.sql.group.GroupedData.pivot without parameter 'values' is not supported. See documentation for more info.
df1.union(df2).groupBy("date").pivot("category").sum("amount")
推奨される修正
以下のように、ピボット対象となる個別の値のリストを追加します。
df = spark.createDataFrame([
Row(course="dotNET", year=2012, earnings=10000),
Row(course="Java", year=2012, earnings=20000)
])
df.groupBy("year").pivot("course", ["dotNET", "Java"]).sum("earnings").show()
その他の推奨事項¶
ピボットの対象となる明確な値のリストを計算することは、大容量のデータセットでは効率的な操作ではなく、ブロック呼び出しになる可能性があります。ピボットする明確な値のリストを明示的に指定することを検討してください。
ピボットする個別の値のリストを明示的に指定しない(非推奨)場合は、ピボット関数の第2引数に以下のコードを追加して、ランタイム時に値を推測することができます*
[v[0] for v in <df>.select(<column>).distinct().limit(<count>).collect()]]
*<df>
をピボットする列と選択する行数のある対応する DataFrame と _ 置き換え _ ます。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1042¶
メッセージ: pyspark.sql.functions.posexplode has a workaround
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.posexplode の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
このメソッドが扱えるシナリオは、 値のリスト
や マップ/ディレクトリ(キー/値)
など、パラメーターとして渡される列のタイプによっていくつかあります。
シナリオ1¶
入力
以下は、 posexplode
の使用例で、 値のリスト をパラメーターとして渡します。
df = spark.createDataFrame(
[Row(a=1,
intlist=[1, 2, 3])])
df.select(posexplode(df.intlist)).collect()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1042
を追加します。
df = spark.createDataFrame(
[Row(a=1,
intlist=[100, 200, 300])])
#EWI: SPRKPY1042 => pyspark.sql.functions.posexplode has a workaround, see documentation for more info
df.select(posexplode(df.intlist)).show()
推奨される修正
同じ動作をさせるには、 functions.flatten メソッドを使用し、余分な列を削除し、インデックスと値の列名を変更します。
df = spark.createDataFrame(
[Row(a=1,
intlist=[1, 2, 3])])
df.select(
flatten(df.intlist))\
.drop("DATA", "SEQ", "KEY", "PATH", "THIS")\
.rename({"INDEX": "pos", "VALUE": "col"}).show()
シナリオ2¶
入力
以下は、 posexplode
の使用例で、 マップ/ディクショナリ(キー/値) をパラメーターとして渡します。
df = spark.createDataFrame([
[1, [1, 2, 3], {"Ashi Garami": "Single Leg X"}, "Kimura"],
[2, [11, 22], {"Sankaku": "Triangle"}, "Coffee"]
],
schema=["idx", "lists", "maps", "strs"])
df.select(posexplode(df.maps)).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1042
を追加します。
df = spark.createDataFrame([
[1, [1, 2, 3], {"Ashi Garami": "Single Leg X"}, "Kimura"],
[2, [11, 22], {"Sankaku": "Triangle"}, "Coffee"]
],
schema=["idx", "lists", "maps", "strs"])
#EWI: SPRKPY1042 => pyspark.sql.functions.posexplode has a workaround, see documentation for more info
df.select(posexplode(df.maps)).show()
推奨される修正
回避策として、 functions.row_number で位置を取得し、 functions.explode でフィールド名を指定して、ディクショナリのそれぞれのキーと値のための値を取得することができます。
df = spark.createDataFrame([
[10, [1, 2, 3], {"Ashi Garami": "Single Leg X"}, "Kimura"],
[11, [11, 22], {"Sankaku": "Triangle"}, "Coffee"]
],
schema=["idx", "lists", "maps", "strs"])
window = Window.orderBy(col("idx").asc())
df.select(
row_number().over(window).alias("pos"),
explode(df.maps).alias("key", "value")).show()
注意: row_numberを使用する場合は完全に等価ではありません。row_numberが1から始まるからです(Sparkメソッドのように0ではありません)。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1013¶
メッセージ: pyspark.sql.functions.acosh has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.acosh の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、pysparkは pyspark.sql.functions.acosh を使用してデータフレームのacoshを計算します。
from pyspark.sql import SparkSession
from pyspark.sql.functions import acosh
spark = SparkSession.builder.getOrCreate()
data = [['V1', 30],
['V2', 60],
['V3', 50],
['V4', 13]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_with_acosh = df.withColumn("acosh_value", acosh(df["value"]))
出力
SMA は、acoshが使用された行に EWI SPRKPY1013 を返すため、修正箇所を識別するのに使用できます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 30],
['V2', 60],
['V3', 50],
['V4', 13]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1013 => pyspark.sql.functions.acosh has a workaround, see documentation for more info
df_with_acosh = df.withColumn("acosh_value", acosh(df["value"]))
推奨される修正
直接の「acosh」実装はありませんが、代わりに「call_function」を使用できます。「acosh」を最初のパラメーターとして使い、colNameを2番目のパラメーターとして使います。
import snowflake.snowpark as snowpark
from snowflake.snowpark import Session
from snowflake.snowpark.functions import call_function, col
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['V1', 30],
['V2', 60],
['V3', 50],
['V4', 13]]
columns = ['Paremeter', 'value']
df = spark.createDataFrame(data, columns)
df_with_acosh = df.select(call_function('ACOSH', col('value')))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1085¶
メッセージ: pyspark.ml.feature.VectorAssembler is not supported.
カテゴリ: 警告
説明¶
pyspark.ml.feature.VectorAssembler はサポートされていません。
シナリオ¶
入力コード
VectorAssembler は、複数の列を1つのベクトルに結合するために使用されます。
data = [
(1, 10.0, 20.0),
(2, 25.0, 30.0),
(3, 50.0, 60.0)
]
df = SparkSession.createDataFrame(data, schema=["Id", "col1", "col2"])
vector = VectorAssembler(inputCols=["col1", "col2"], output="cols")
出力コード
ツールは出力コードにこの EWI SPRKPY1085
を追加して、このクラスがSnowparkでサポートされていないことを知らせます。
data = [
(1, 10.0, 20.0),
(2, 25.0, 30.0),
(3, 50.0, 60.0)
]
df = spark.createDataFrame(data, schema=["Id", "col1", "col2"])
#EWI: SPRKPY1085 => The pyspark.ml.feature.VectorAssembler function is not supported.
vector = VectorAssembler(inputCols=["col1", "col2"], output="cols")
推奨される修正
pyspark.ml.feature.VectorAssembler には推奨される修正がありません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1027¶
警告
この問題コードは、 Spark Conversion Core 4.5.2 以降 廃止 されています
メッセージ: pyspark.sql.readwriter.DataFrameReader.json has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.json 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.readwriter.DataFrameReader.json
関数の使用例です。この例では、 json
関数を使用して、指定されたスキーマを持つ複数の .json
ファイルを読み込んでいます。また、 primitiveAsString や dateFormat などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。
file_paths = [
"path/to/your/file1.json",
"path/to/your/file2.json",
"path/to/your/file3.json",
]
df = session.read.json(
file_paths,
schema=my_schema,
primitiveAsString=True,
dateFormat="2023-06-20"
)
出力
SMA は出力コードに EWI SPRKPY1027
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
file_paths = [
"path/to/your/file1.json",
"path/to/your/file2.json",
"path/to/your/file3.json",
]
#EWI: SPRKPY1027 => pyspark.sql.readwriter.DataFrameReader.json has a workaround, see documentation for more info
df = session.read.json(
file_paths,
schema=my_schema,
primitiveAsString=True,
dateFormat="2023-06-20"
)
推奨される修正
このセクションでは、 パス
パラメーター、 スキーマ
パラメーター、およびいくつかの オプション
をSnowparkで動作させるための構成方法を説明します。
1. パスパラメーター
Snowparkでは、 path パラメーターはステージの場所にある必要があるため、回避策として、仮ステージを作成し、プレフィックス file://
を使用して、各 .json
ファイルをそのステージに追加することができます。
2. スキーマパラメーター
Snowparkでは、 json
関数のパラメーターとして スキーマ を定義することはできません。回避策として、 Snowflake.snowpark.DataFrameReader.schema 関数を使用することができます。
3. オプションパラメーター
Snowparkでは、 追加オプション を json
関数のパラメーターとして定義することはできません。回避策として、 Snowflake.snowpark.DataFrameReader.option 関数を使用して、これらのパラメーターを DataFrameReader のオプションとして指定することができます。
注釈
以下のオプションはSnowparkではサポートされていません。
allowBackslashEscapingAnyCharacter
allowComments
allowNonNumericNumbers
allowNumericLeadingZero
allowSingleQuotes
allowUnquotedControlChars
allowUnquotedFieldNames
columnNameOfCorruptRecord
dropFiledIfAllNull
encoding
ignoreNullFields
lineSep
locale
mode
multiline
prefersDecimal
primitiveAsString
samplingRatio
timestampNTZFormat
timeZone
以下は、Snowparkで動作するように上記の提案を適用した後の入力コードの全体的な例です。
stage = f'{session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {stage}')
session.file.put(f"file:///path/to/your/file1.json", f"@{stage}")
session.file.put(f"file:///path/to/your/file2.json", f"@{stage}")
session.file.put(f"file:///path/to/your/file3.json", f"@{stage}")
df = session.read.schema(my_schema).option("dateFormat", "2023-06-20").json(stage)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1076¶
メッセージ: Parameters in pyspark.sql.readwriter.DataFrameReader methods are not supported.これは、 CSV、 JSON、 PARQUET メソッドに適用されます。
カテゴリ: 警告。
説明¶
pyspark.sql.readwriter.DataFrameReader オブジェクトの CSV、 JSON、 PARQUET メソッドに対して、ツールはパラメーターを分析し、それぞれの場合に応じて変換を追加します。
すべてのパラメーターは、Snowparkでの同等の名前と一致します。この場合、ツールはパラメーターを.option()呼び出しに変換します。この場合、パラメーターはこの EWI を追加しません。
Snowparkで同等のパラメーターと一致しない場合があります。この場合、ツールはパラメーター情報とともにこの EWI を追加し、メソッド呼び出しから削除します。
等価性のリスト:
CSV の等価性:
Sparkキー |
Snowparkの等価性 |
---|---|
sep |
FIELD_DELIMITER |
header |
PARSE_HEADER |
lineSep |
RECORD_DELIMITER |
pathGlobFilter |
PATTERN |
quote |
FIELD_OPTIONALLY_ENCLOSED_BY |
nullValue |
NULL_IF |
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
inferSchema |
INFER_SCHEMA |
delimiter |
FIELD_DELIMITER |
JSON の等価性:
Sparkキー |
Snowparkの等価性 |
---|---|
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
pathGlobFilter |
PATTERN |
PARQUET の等価性:
Sparkキー |
Snowparkの等価性 |
---|---|
pathGlobFilter |
PATTERN |
シナリオ¶
シナリオ1¶
入力
以下は CVS 用のいくつかの例です。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.csv("path3", None,None,None,None,None,None,True).show()
出力
変換後のコードでは、パラメーターはcvs関数の個々のオプションとして追加されます。
from snowflake.snowpark import Session
spark = Session.builder.app_name('myapp', True).getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
#EWI: SPRKPY1076 => Some of the included parameters are not supported in the csv function, the supported ones will be added into a option method.
spark.read.option("FIELD_DELIMITER", None).option("PARSE_HEADER", True).option("FIELD_OPTIONALLY_ENCLOSED_BY", None).csv("path3").show()
シナリオ2¶
入力
以下は JSON 用のいくつかの例です。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.json("/myPath/jsonFile/", dateFormat='YYYY/MM/DD').show()
出力
変換後のコードでは、パラメーターはjson関数に個別のオプションとして追加されます。
from snowflake.snowpark import Session
spark = Session.builder.app_name('myapp', True).getOrCreate()
#EWI: SPRKPY1076 => Some of the included parameters are not supported in the json function, the supported ones will be added into a option method.
spark.read.option("DATE_FORMAT", 'YYYY/MM/DD').json("/myPath/jsonFile/").show()
シナリオ3¶
入力
以下は PARQUET 用のいくつかの例です。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.parquet("/path/to/my/file.parquet", pathGlobFilter="*.parquet").show()
出力
変換後のコードでは、パラメーターは個々のオプションとしてparquet関数に追加されます。
from snowflake.snowpark import Session
spark = Session.builder.app_name('myapp', True).getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
#EWI: SPRKPY1076 => Some of the included parameters are not supported in the parquet function, the supported ones will be added into a option method.
#EWI: SPRKPY1029 => The parquet function require adjustments, in Snowpark the parquet files needs to be located in an stage. See the documentation for more info.
spark.read.option("PATTERN", "*.parquet").parquet("/path/to/my/file.parquet")
その他の推奨事項¶
非等価パラメーターが存在する場合は、変換後の動作を確認することをお勧めします。
また、ドキュメントはより良い適合を見つけるのに役立ちます。
CSV 用のオプションドキュメント:
JSON 用のオプションドキュメント:
PARQUET 用のオプションドキュメント:
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1066¶
メッセージ: The Spark element does not apply since snowflake use micro-partitioning mechanism are created automatically.
カテゴリ: 警告
説明¶
この問題は、パーティションに関連する要素の使用をツールが検出した場合に発生します。
Snowflakeの マイクロパーティション の使用により、これらの要素は適用されません。
入力コード
この例では、 sortWithinPartitions を使用して、指定した列で並べ替えられた DataFrame にパーティションを作成します。
df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
df.sortWithinPartitions("age", ascending=False)
出力コード
SMA は、Spark要素が不要であることを示す EWI メッセージを追加します。
df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
#EWI: SPRKPY1066 => The element does not apply since snowflake use micro-partitioning mechanism are created automatically.
df.sortWithinPartitions("age", ascending=False)
推奨される修正
要素の使用を削除します。
df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1037¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.functions.sort_array has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.sort_array 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.sort_array
関数の使用例です。この例では、 sort_array
関数を使用して、 numbers 配列を昇順と降順に並べ替えています。
df = spark.createDataFrame([(1, [3, 1, 2]), (2, [10, 5, 8]), (3, [6, 4, 7])], ["id", "numbers"])
df_sorted_asc = df.withColumn("sorted_numbers_asc", sort_array("numbers", asc=True))
df_sorted_desc = df.withColumn("sorted_numbers_desc", sort_array("numbers", asc=False))
出力
SMA は出力コードに EWI SPRKPY1037
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(1, [3, 1, 2]), (2, [10, 5, 8]), (3, [6, 4, 7])], ["id", "numbers"])
#EWI: SPRKPY1037 => pyspark.sql.functions.sort_array has a workaround, see documentation for more info
df_sorted_asc = df.withColumn("sorted_numbers_asc", sort_array("numbers", asc=True))
#EWI: SPRKPY1037 => pyspark.sql.functions.sort_array has a workaround, see documentation for more info
df_sorted_desc = df.withColumn("sorted_numbers_desc", sort_array("numbers", asc=False))
推奨される修正
回避策として、 sort_array
関数の拡張を提供する snowpark_extensions パッケージをインポートすることができます。
import snowpark_extensions
df = spark.createDataFrame([(1, [3, 1, 2]), (2, [10, 5, 8]), (3, [6, 4, 7])], ["id", "numbers"])
df_sorted_asc = df.withColumn("sorted_numbers_asc", sort_array("numbers", asc=True))
df_sorted_desc = df.withColumn("sorted_numbers_desc", sort_array("numbers", asc=False))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1003¶
メッセージ : An error occurred when loading the symbol table.
カテゴリ : 変換エラー。
説明¶
この問題は、記号テーブルの記号処理にエラーがある場合に発生します。記号テーブルは、 SMA の基になるアーキテクチャの一部であり、より複雑な変換を可能にします。このエラーは、ソースコード内の予期せぬステートメントが原因である可能性があります。
その他の推奨事項 ¶
これはソースコード自体のエラーとは考えにくく、むしろツールがソースコードを処理する方法のエラーです。最良の解決策は、 SMA 内 に問題を投稿することでしょう。
詳細なサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1052¶
警告
この問題コードは、 Spark Conversion Coreバージョン2.8.0 以降 廃止 されています
メッセージ: pyspark.sql.session.SparkSession.Builder.enableHiveSupport has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.session.SparkSession.Builder.enableHiveSupport の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 SparkSession を構成し、 enableHiveSupport
メソッドを使用してHiveサポートを有効にする例です。
spark = Session.builder.appName("Merge_target_table")\
.config("spark.port.maxRetries","100") \
.enableHiveSupport().getOrCreate()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1052
を追加します。
#EWI: SPRKPY1052 => pyspark.sql.session.SparkSession.Builder.enableHiveSupport has a workaround, see documentation for more info
spark = Session.builder.appName("Merge_target_table")\
.config("spark.port.maxRetries","100") \
.enableHiveSupport().getOrCreate()
推奨される修正
Snowparkでは不要なため、 enableHiveSupport
関数の使用を削除します。
spark = Session.builder.appName("Merge_target_table")\
.config("spark.port.maxRetries","100") \
.getOrCreate()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1043¶
メッセージ: pyspark.sql.functions.posexplode_outer has a workaround
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.posexplode_outer の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
このメソッドが扱えるシナリオは、 値のリスト
や マップ/ディレクトリ(キー/値)
など、パラメーターとして渡される列のタイプによっていくつかあります。
シナリオ1¶
入力
以下は、 posexplode_outer
の使用例で、 値のリスト を渡します。
df = spark.createDataFrame(
[
(1, ["foo", "bar"]),
(2, []),
(3, None)],
("id", "an_array"))
df.select("id", "an_array", posexplode_outer("an_array")).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1043
を追加します。
df = spark.createDataFrame(
[
(1, ["foo", "bar"]),
(2, []),
(3, None)],
("id", "an_array"))
#EWI: SPRKPY1043 => pyspark.sql.functions.posexplode_outer has a workaround, see documentation for more info
df.select("id", "an_array", posexplode_outer("an_array")).show()
推奨される修正
同じ動作をさせるには、 functions.flatten メソッドを使用し、 outer
パラメーターをTrueで送信し、余分な列を削除し、インデックスと値の列名を変更します。
df = spark.createDataFrame(
[
(1, ["foo", "bar"]),
(2, []),
(3, None)],
("id", "an_array"))
df.select(
flatten(df.an_array, outer=True))\
.drop("DATA", "SEQ", "KEY", "PATH", "THIS")\
.rename({"INDEX": "pos", "VALUE": "col"}).show()
シナリオ2¶
入力
以下は、 マップ/ディクショナリ(キー/値) を渡すposexplode_outerの別の使用例です。
df = spark.createDataFrame(
[
(1, {"x": 1.0}),
(2, {}),
(3, None)],
("id", "a_map"))
df.select(posexplode_outer(df.a_map)).show()
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1043
を追加します。
df = spark.createDataFrame(
[
(1, {"x": "Ashi Garami"}),
(2, {}),
(3, None)],
("id", "a_map"))
#EWI: SPRKPY1043 => pyspark.sql.functions.posexplode_outer has a workaround, see documentation for more info
df.select(posexplode_outer(df.a_map)).show()
推奨される修正
回避策として、 functions.row_number で位置を取得し、 functions.explode_outer でフィールド名を指定して、ディクショナリのキー/値の値を取得することができます。
df = spark.createDataFrame(
[
(1, {"x": "Ashi Garami"}),
(2, {}),
(3, None)],
("id", "a_map"))
window = Window.orderBy(col("id").asc())
df.select(
row_number().over(window).alias("pos"),
explode_outer(df.a_map)).show()
注意: row_numberを使用する場合は完全に等価ではありません。row_numberが1から始まるからです(Sparkメソッドのように0ではありません)。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1012¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.dataframe.DataFrameStatFunctions.writeTo has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.dataframe.DataFrameStatFunctions.writeTo の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、dataframe dfはSparkテーブルの「table」に書き込まれます。
writer = df.writeTo("table")
出力
SMA は、 DataFrameStatFunctions.writeToが使用された行に EWI SPRKPY1012 を返すため、修正箇所を識別するのに使用できます。
#EWI: SPRKPY1012 => pyspark.sql.dataframe.DataFrameStatFunctions.writeTo has a workaround, see documentation for more info
writer = df.writeTo("table")
推奨される修正
代わりに、df.write.SaveAsTable()を使用します。
import df.write as wt
writer = df.write.save_as_table(table)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1084¶
この問題コードは、 Spark Conversion Core 4.12.0 以降 廃止 されています
メッセージ: pyspark.sql.readwriter.DataFrameWriter.option is not supported.
カテゴリ: 警告
説明¶
pyspark.sql.readwriter.DataFrameWriter.option 関数はサポートされていません。
シナリオ¶
入力コード
以下は、 option
メソッドを使用した例です。このメソッドは、 DataFrame のデータを書き込む際にその他の構成を追加するために使用します。
path_csv_file = "/path/to/file.csv"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
df.write.option("header", True).csv(csv_file_path)
df.write.option("sep", ";").option("lineSep","-").csv(csv_file_path)
出力コード
ツールは出力コードにこの EWI SPRKPY1084
を追加して、この関数がSnowparkでサポートされていないことを知らせます。
path_csv_file = "/path/to/file.csv"
data = [
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
#EWI: SPRKPY1084 => The pyspark.sql.readwriter.DataFrameWriter.option function is not supported.
df.write.option("header", True).csv(csv_file_path)
#EWI: SPRKPY1084 => The pyspark.sql.readwriter.DataFrameWriter.option function is not supported.
df.write.option("sep", ";").option("lineSep","-").csv(csv_file_path)
推奨される修正
pyspark.sql.readwriter.DataFrameWriter.optionメソッドには推奨される修正がありません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1026¶
警告
この問題コードは、 Spark Conversion Core 4.3.2 以降 廃止 されています
メッセージ: pyspark.sql.readwriter.DataFrameReader.csv has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.csv 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.readwriter.DataFrameReader.csv
関数の使用例です。この例では、 csv
関数を使用して、指定されたスキーマを持つ複数の .csv
ファイルを読み込んでいます。また、 encoding、 header、 sep などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。
file_paths = [
"path/to/your/file1.csv",
"path/to/your/file2.csv",
"path/to/your/file3.csv",
]
df = session.read.csv(
file_paths,
schema=my_schema,
encoding="UTF-8",
header=True,
sep=","
)
出力
SMA は出力コードに EWI SPRKPY1026
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
file_paths = [
"path/to/your/file1.csv",
"path/to/your/file2.csv",
"path/to/your/file3.csv",
]
#EWI: SPRKPY1026 => pyspark.sql.readwriter.DataFrameReader.csv has a workaround, see documentation for more info
df = session.read.csv(
file_paths,
schema=my_schema,
encoding="UTF-8",
header=True,
sep=","
)
推奨される修正
このセクションでは、 パス
パラメーター、 スキーマ
パラメーター、およびいくつかの オプション
をSnowparkで動作させるための構成方法を説明します。
1. パスパラメーター
Snowparkでは、 パス パラメーターをステージの場所にする必要があるため、回避策として、仮ステージを作成し、プレフィックス file://
を使用して、各 .csv
ファイルをそのステージに追加することができます。
2. スキーマパラメーター
Snowparkでは、 スキーマ を csv
関数のパラメーターとして定義することはできません。回避策として、 Snowflake.snowpark.DataFrameReader.schema 関数を使用することができます。
3. オプションパラメーター
Snowparkでは、 追加オプション を csv
関数のパラメーターとして定義することはできません。回避策として、 Snowflake.snowpark.DataFrameReader.option 関数を使用して、これらのパラメーターを DataFrameReader のオプションとして指定することができます。
注釈
以下のオプションはSnowparkでは サポートされていません。
columnNameOfCorruptRecord
emptyValue
enforceSchema
header
ignoreLeadingWhiteSpace
ignoreTrailingWhiteSpace
inferSchema
locale
maxCharsPerColumn
maxColumns
mode
multiLine
nanValue
negativeInf
nullValue
positiveInf
quoteAll
samplingRatio
timestampNTZFormat
unescapedQuoteHandling
以下は、Snowparkで動作するように上記の提案を適用した後の入力コードの全体的な例です。
stage = f'{session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {stage}')
session.file.put(f"file:///path/to/your/file1.csv", f"@{stage}")
session.file.put(f"file:///path/to/your/file2.csv", f"@{stage}")
session.file.put(f"file:///path/to/your/file3.csv", f"@{stage}")
df = session.read.schema(my_schema).option("encoding", "UTF-8").option("sep", ",").csv(stage)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1077¶
メッセージ: SQL embedded code cannot be processed.
カテゴリ: 警告。
説明¶
この問題は、Snowparkに変換できない SQL 埋め込みコードをツールが検出した場合に表示されます。
詳細情報については、 SQL 埋め込みコードのセクションをご確認ください。
シナリオ¶
入力
この例では、 SQL のコードを、Pyspark.sqlメソッドのパラメーターとして使用されるqueryという変数に埋め込んでいます。
query = f"SELECT * from myTable"
spark.sql(query)
出力
SMA は、 PySpark.sqlパラメーターが変数であり SQL コードではないことを検出するため、 EWI SPRKPY1077 メッセージが PySpark.sql行に追加されます。
query = f"SELECT * myTable"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
spark.sql(query)
その他の推奨事項¶
SQL の変換の場合、このコードは文字列値としてのみ、かつ補間なしでメソッドのパラメーターとして直接内部にある必要があります。PySpark.SQL 関数に SQL を送信し、Snowflakeでの機能を検証してください。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1067¶
メッセージ: The pyspark.sql.functions.split has parameters that are not supported in Snowpark.
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.split の2つ以上のパラメーターまたは正規表現パターンのパラメーターでの使用をツールが検出した場合に発生します。
シナリオ¶
シナリオ1¶
入力コード
この例では、split関数に2つ以上のパラメーターがあります。
df.select(split(columnName, ",", 5))
出力コード
ツールは出力コードにこの EWI を追加して、2つ以上のパラメーターを持つ場合は、この関数がサポートされていないことを知らせます。
#EWI: SPRKPY1067 => Snowpark does not support split functions with more than two parameters or containing regex pattern. See documentation for more info.
df.select(split(columnName, ",", 5))
推奨される修正
2つのパラメーターのみを持つsplit関数を保持します。
df.select(split(columnName, ","))
シナリオ2¶
入力コード
この例では、split関数のパラメーターに正規表現パターンがあります。
df.select(split(columnName, "^([\d]+-[\d]+-[\d])"))
出力コード
ツールは出力コードにこの EWI を追加して、正規表現パターンをパラメーターとして持つ場合は、この関数がサポートされていないことを知らせます。
#EWI: SPRKPY1067 => Snowpark does not support split functions with more than two parameters or containing regex pattern. See documentation for more info.
df.select(split(columnName, "^([\d]+-[\d]+-[\d])"))
推奨される修正
このメソッド functions.split(str: ColumnOrName, pattern: str, limit: int = - 1)
のSpark署名は、Snowparkメソッド functions.split(str: Union[Column, str], pattern: Union[Column, str])
と完全には一致しません。そのため、今のところ正規表現を使用するシナリオには推奨される修正がありません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1036¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.column.Column.getField has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.column.Column.getField 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.column.Column.getField
関数の使用例です。この例では、 getField
関数を使用して、 info 列から name を抽出しています。
df = spark.createDataFrame([(1, {"name": "John", "age": 30}), (2, {"name": "Jane", "age": 25})], ["id", "info"])
df_with_name = df.withColumn("name", col("info").getField("name"))
出力
SMA は出力コードに EWI SPRKPY1036
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(1, {"name": "John", "age": 30}), (2, {"name": "Jane", "age": 25})], ["id", "info"])
#EWI: SPRKPY1036 => pyspark.sql.column.Column.getField has a workaround, see documentation for more info
df_with_name = df.withColumn("name", col("info").getField("name"))
推奨される修正
回避策として、フィールド名をインデックスとして Snowpark列インデクサー演算子 を使用することができます。
df = spark.createDataFrame([(1, {"name": "John", "age": 30}), (2, {"name": "Jane", "age": 25})], ["id", "info"])
df_with_name = df.withColumn("name", col("info")["name"])
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1002¶
メッセージ : < element > is not supported,Spark element is not supported.
カテゴリ : 変換エラー。
説明¶
このエラーは、Snowparkでサポートされておらず、独自のエラーコードが関連付けられていない要素の使用をツールが検出した場合に表示されます。これは、サポートされていない要素に対して SMA が使用する一般的なエラーコードです。
その他の推奨事項¶
メッセージ上のオプションや要素がサポートされていなくても、解決策が見つからないわけではありません。ツール自体が解決策を見つけられないというだけのことです。
pyspark.mlライブラリのサポートされていない要素に遭遇した場合は、代替の方法を検討します。Snowflakeのこのガイドのような、mlに関連する問題のウォークスルーに利用可能な追加のガイドがあります。
ソースコードの構文が正しいか確認します。(issues.csvファイルを使用して、変換エラーの発生箇所を特定することができます。)構文が正しければ、 SMA の問題を報告するオプションを使用して、特定の要素で変換エラーが発生したことを報告します。この問題を報告する際に、エラーの原因となったコード行を説明文に含めます。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1053¶
メッセージ: An error occurred when extracting the dbc files.
カテゴリ: 警告。
説明¶
この問題は、dbcファイルを抽出できない場合に発生します。この警告は、重すぎる、アクセスできない、読み取り専用などのような原因が考えられます。
その他の推奨事項¶
回避策として、ファイルが重すぎて処理できない場合は、ファイルのサイズを確認することができます。また、アクセスの問題を避けるために、ツールがアクセスできるかどうかを分析します。
サポートの詳細については、 snowconvert-info@snowflake.com にメールでお問い合わせください。Snowflakeとサポート契約を結んでいる場合は、セールスエンジニアにご連絡ください。必要なサポートにご案内します。
SPRKPY1080¶
メッセージ: The value of SparkContext is replaced with 'session' variable.
カテゴリ: 警告
説明¶
SparkのコンテキストはSnowparkセッションを作成するsessionという変数に格納されます。
シナリオ¶
入力
このスニペットは SparkContext を説明します
## Input Code
from pyspark import SparkContext
from pyspark.sql import SparkSession
def example1():
sc = SparkContext("local[*]", "TestApp")
sc.setLogLevel("ALL")
sc.setLogLevel("DEBUG")
出力
この出力コードでは、 SMA は、 PySpark.SparkContext を SparkSession で置き換えています。 SMA は、「connection.json」ファイルの接続を置き換えるテンプレートも追加し、この構成をconnection_parameter変数にロードしていることに注意してください。
## Output Code
import logging
import sys
import json
from snowflake.snowpark import Session
from snowflake.snowpark import Session
def example1():
jsonFile = open("connection.json")
connection_parameter = json.load(jsonFile)
jsonFile.close()
#EWI: SPRKPY1080 => The value of SparkContext is replaced with 'session' variable.
sc = Session.builder.configs(connection_parameter).getOrCreate()
sc.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
logging.basicConfig(stream = sys.stdout, level = logging.NOTSET)
logging.basicConfig(stream = sys.stdout, level = logging.DEBUG)
推奨される修正
構成ファイル「connection.json」を必要な接続情報で更新する必要があります。
{
"user": "my_user",
"password": "my_password",
"account": "my_account",
"role": "my_role",
"warehouse": "my_warehouse",
"database": "my_database",
"schema": "my_schema"
}
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1073¶
メッセージ: pyspark.sql.functions.udf without parameters or return type parameter are not supported
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.udf を関数またはデコレーターとして使用することをツールが検出した場合に発生します。パラメーターがない場合と戻り値タイプパラメーターがある場合の2つのケースでサポートされていません。
シナリオ¶
シナリオ1¶
入力
Pysparkでは、ユーザー定義関数を入力や戻り値のタイプのパラメーターなしで作成できます。
from pyspark.sql import SparkSession, DataFrameStatFunctions
from pyspark.sql.functions import col, udf
spark = SparkSession.builder.getOrCreate()
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
my_udf = udf(lambda s: len(s))
df.withColumn('Len Value' ,my_udf(col('Value')) ).show()
出力
Snowparkでは、Udf関数に入力や戻り値のタイプが必要です。これらは提供されておらず、 SMA は、これらのパラメーターを変換できません。
from snowflake.snowpark import Session, DataFrameStatFunctions
from snowflake.snowpark.functions import col, udf
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1073 => pyspark.sql.functions.udf function without the return type parameter is not supported. See documentation for more info.
my_udf = udf(lambda s: len(s))
df.withColumn('Len Value' ,my_udf(col('Value')) ).show()
推奨される修正
このシナリオを修正するには、入力と出力の戻り値のタイプのインポートと、 udf 関数 _my_udf での戻り値とinput_types[] のタイプ のパラメーターを追加します。
from snowflake.snowpark import Session, DataFrameStatFunctions
from snowflake.snowpark.functions import col, udf
from snowflake.snowpark.types import IntegerType, StringType
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
my_udf = udf(lambda s: len(s), return_type=IntegerType(), input_types=[StringType()])
df.with_column("result", my_udf(df.Value)).show()
シナリオ2¶
PySpark では、パラメーターなしで@udfデコレーターを使用できます。
入力
from pyspark.sql.functions import col, udf
spark = SparkSession.builder.getOrCreate()
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
@udf()
def my_udf(str):
return len(str)
df.withColumn('Len Value' ,my_udf(col('Value')) ).show()
出力
Snowparkでは、 udf デコレーターのすべてのパラメーターが必要です。
from snowflake.snowpark.functions import col, udf
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1073 => pyspark.sql.functions.udf decorator without parameters is not supported. See documentation for more info.
@udf()
def my_udf(str):
return len(str)
df.withColumn('Len Value' ,my_udf(col('Value')) ).show()
推奨される修正
このシナリオを修正するには、入力と出力の戻り値のタイプのインポートと、 udf の@udfデコレータにreturn_typeとinput_types[]のパラメーターを追加する必要があります。
from snowflake.snowpark.functions import col, udf
from snowflake.snowpark.types import IntegerType, StringType
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Q1', 'Test 1'],
['Q2', 'Test 2'],
['Q3', 'Test 1'],
['Q4', 'Test 1']]
columns = ['Quadrant', 'Value']
df = spark.createDataFrame(data, columns)
@udf(return_type=IntegerType(), input_types=[StringType()])
def my_udf(str):
return len(str)
df.withColumn('Len Value' ,my_udf(col('Value')) ).show()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1022¶
メッセージ: pyspark.sql.functions.log10 has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.functions.log10 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.functions.log10
関数の使用例です。この例では、 log10
関数を使用して、 value 列の基数10の対数を計算しています。
df = spark.createDataFrame([(1,), (10,), (100,), (1000,), (10000,)], ["value"])
df_with_log10 = df.withColumn("log10_value", log10(df["value"]))
出力
SMA は出力コードに EWI SPRKPY1022
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(1,), (10,), (100,), (1000,), (10000,)], ["value"])
#EWI: SPRKPY1022 => pyspark.sql.functions.log10 has a workaround, see documentation for more info
df_with_log10 = df.withColumn("log10_value", log10(df["value"]))
推奨される修正
回避策として、リテラル値 10
をベースとして渡して、 Snowflake.snowpark.functions.log 関数を使用することができます。
df = spark.createDataFrame([(1,), (10,), (100,), (1000,), (10000,)], ["value"])
df_with_log10 = df.withColumn("log10_value", log(10, df["value"]))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1016¶
警告
この問題コードは、 Spark Conversion Core Version 0.11.7 以降 廃止 されています
メッセージ: pyspark.sql.functions.collect_set has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.collect_set の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
collect_set を使用して、重複することなく_colnameの要素を取得します。
col = collect_set(colName)
出力
SMA は、collect_setが使用された行に EWI SPRKPY1016 を返すため、修正箇所を識別するのに使用できます。
#EWI: SPRKPY1016 => pyspark.sql.functions.collect_set has a workaround, see documentation for more info
col = collect_set(colName)
推奨される修正
array_agg関数を使用し、値Trueの第2引数を追加します。
col = array_agg(col, True)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1047¶
警告
この問題コードは、 Spark Conversion Core Version 4.6.0 以降 廃止 されています
説明¶
この問題は、 pyspark.context.SparkContext.setLogLevel の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、 setLogLevel
メソッドの使用例です。
sparkSession.sparkContext.setLogLevel("WARN")
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1047
を追加します。
#EWI: SPRKPY1047 => pyspark.context.SparkContext.setLogLevel has a workaround, see documentation for more info
sparkSession.sparkContext.setLogLevel("WARN")
推奨される修正
setLogLevel
関数の使用を logging.basicConfig
に置き換えます。この関数は、単純なログの使用のための便利な関数のセットを提供します。これを使うためには、「logging」と「sys」という2つのモジュールをインポートし、「レベル等価表」を使ってレベル定数を置き換える必要があります。
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.WARNING)
レベル等価表
レベルソースパラメーター |
レベルターゲットパラメーター |
---|---|
"ALL" |
これと同一のものはありません |
"DEBUG" |
logging.DEBUG |
"ERROR" |
logging.ERROR |
"FATAL" |
logging.CRITICAL |
"INFO" |
logging.INFO |
"OFF" |
logging.NOTSET |
"TRACE" |
これと同一のものはありません |
"WARN" |
logging.WARNING |
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1057¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ: PySpark Dataframe Option argument contains a value that is not a literal, therefore cannot be evaluated
カテゴリ: 警告。
説明¶
この問題コードは、廃止されました。古いバージョンをお使いの場合は、最新のバージョンにアップグレードしてください。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1006¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ : pyspark.context.SparkContext is not required
カテゴリ : 警告。
説明¶
この問題は、Snowflakeでは必須ではない pyspark.context.SparkContext の使用をツールが検出した場合に発生します。
シナリオ¶
入力
この例では、Sparkクラスターへの接続を作成するために2つのコンテキストがあります。
from pyspark import SparkContext
sql_context1 = SparkContext(my_sc1)
sql_context2 = SparkContext(sparkContext=my_sc2)
出力
Snowflakeにはクラスターが存在しないため、コンテキストは必要ありません。そのため、Sparkのプロパティを含む変数my_sc1とmy_sc2は不要か、コードを修正する必要があることに注意してください。
from snowflake.snowpark import Session
#EWI: SPRKPY1006 => pyspark.sql.context.SparkContext is not required
sql_context1 = my_sc1
#EWI: SPRKPY1006 => pyspark.sql.context.SparkContext is not required
sql_context2 = my_sc2
その他の推奨事項¶
これは不要なパラメーターが削除され、警告コメントが挿入されたものです。ユーザーからのアクションはありません。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1032¶
メッセージ: _ spark element _ is not defined
カテゴリ: 変換エラー
説明¶
この問題は、指定された要素に対して適切なマッピングステータスを SMA が決定できなかった場合に発生します。これは、この要素がSnowparkでサポートされているかどうかを SMA がまだ知らないことを意味します。これは、定義されていない要素に対して SMA が使用する一般的なエラーコードです。
シナリオ¶
入力
以下は、 SMA が適切なマッピングステータスを決定できなかった関数の例です。この場合、 not_defined_function()
が有効な PySpark 関数であり、コードが実行されると仮定します。
sc.parallelize(["a", "b", "c", "d", "e"], 3).not_defined_function().collect()
出力
SMA は出力コードに EWI SPRKPY1032
を追加して、この要素が定義されていないことを知らせます。
#EWI: SPRKPY1032 => pyspark.rdd.RDD.not_defined_function is not defined
sc.parallelize(["a", "b", "c", "d", "e"], 3).not_defined_function().collect()
推奨される修正
問題の識別を試みるために、以下を検証します。
ソースコードの構文が正しいか、スペルが正しいかを確認します。
SMA でサポートされている PySpark バージョンを使用しているか確認します。SMA を実行する時点で SMA がサポートしている PySpark バージョンを知るには、
DetailedReport.docx
ファイルの最初のページを確認します。
これが有効な PySpark 要素である場合は、 SMA の 問題を報告する オプションを使用して、その特定の要素で変換エラーが発生したことを報告し、役に立つと思われる追加情報を含めます。
定義されていない要素があるからといって、Snowparkでサポートされないとは限らないことに注意してください。Snowparkドキュメント を参照して、同等の要素が存在するかどうかを検証する必要があります。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1063¶
メッセージ: pyspark.sql.pandas.functions.pandas_udf has workaround.
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.pandas.functions.pandas_udf の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
pandas_udf関数は、大容量データを扱うユーザー定義関数を作成するために使用します。
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def modify_df(pdf):
return pd.DataFrame({'result': pdf['col1'] + pdf['col2'] + 1})
df = spark.createDataFrame([(1, 2), (3, 4), (1, 1)], ["col1", "col2"])
new_df = df.groupby().apply(modify_df)
出力
SMA は、pandas_udfに回避策があることを示す EWI メッセージを追加します。
#EWI: SPRKPY1062 => pyspark.sql.pandas.functions.pandas_udf has a workaround, see documentation for more info
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def modify_df(pdf):
return pd.DataFrame({'result': pdf['col1'] + pdf['col2'] + 1})
df = spark.createDataFrame([(1, 2), (3, 4), (1, 1)], ["col1", "col2"])
new_df = df.groupby().apply(modify_df)
推奨される修正
パラメータータイプを新しいパラメーター input_types
として明示的に指定し、 functionType
パラメーターが該当する場合は削除します。作成した関数は、selectステートメントの中で呼び出す必要があります。
@pandas_udf(
return_type = schema,
input_types = [PandasDataFrameType([IntegerType(), IntegerType()])]
)
def modify_df(pdf):
return pd.DataFrame({'result': pdf['col1'] + pdf['col2'] + 1})
df = spark.createDataFrame([(1, 2), (3, 4), (1, 1)], ["col1", "col2"])
new_df = df.groupby().apply(modify_df) # You must modify function call to be a select and not an apply
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1078¶
メッセージ: The argument of the pyspark.context.SparkContext.setLogLevel function is not a literal value and therefore could not be evaluated
カテゴリ: 警告
説明¶
この問題は、 pyspark.context.SparkContext.setLogLevel 関数の引数が変数である場合など、リテラル値でない引数の使用を SMA が検出した場合に発生します。
SMA はソースコードの静的分析を行うため、引数の内容を評価し、Snowparkで同等のものを決定することはできません。
シナリオ¶
入力
この例では、logLevelは変数my_log_levelで定義され、 setLogLevel メソッドのパラメーターとしてmy_log_levelが使用されます。
my_log_level = "WARN"
sparkSession.sparkContext.setLogLevel(my_log_level)
出力
SMA はログレベルパラメーターの引数を評価できないため、 EWI SPRKPY1078 は変換されたログの行の上に追加されます
my_log_level = "WARN"
#EWI: SPRKPY1078 => my_log_level is not a literal value and therefore could not be evaluated. Make sure the value of my_log_level is a valid level in Snowpark. Valid log levels are: logging.CRITICAL, logging.DEBUG, logging.ERROR, logging.INFO, logging.NOTSET, logging.WARNING
logging.basicConfig(stream = sys.stdout, level = my_log_level)
推奨される修正
SMA は、引数を評価できなかったとしても、 pyspark.context.SparkContext.setLogLevel
関数をSnowparkと同等の関数に変換します。生成された出力コードの level
引数の値が、以下のテーブルに従ってSnowparkで有効で同等のログレベルであることを確認してください。
PySpark ログレベル |
Snowparkログレベル同等 |
---|---|
ALL |
logging.NOTSET |
DEBUG |
logging.DEBUG |
ERROR |
logging.ERROR |
FATAL |
logging.CRITICAL |
INFO |
logging.INFO |
OFF |
logging.WARNING |
TRACE |
logging.NOTSET |
WARN |
logging.WARNING |
したがって、推奨される修正は次のようになります。
my_log_level = logging.WARNING
logging.basicConfig(stream = sys.stdout, level = my_log_level)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1029¶
メッセージ: This issue appears when the tool detects the usage of pyspark.sql.readwriter.DataFrameReader.parquet.この関数はサポートされていますが、SnowparkとSpark API の違いによっては、手動での変更が必要になる場合があります。
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.parquet 関数の使用を SMA が検出した場合に発生します。この関数はSnowparkでもサポートされていますが、いくつかの違いがあるため、手動での変更が必要です。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.readwriter.DataFrameReader.parquet
関数の使用例です。
file_paths = [
"path/to/your/file1.parquet",
"path/to/your/file2.parquet",
"path/to/your/file3.parquet",
]
df = session.read.parquet(
*file_paths,
mergeSchema="true",
pathGlobFilter="*file*",
recursiveFileLookup="true",
modifiedBefore="2024-12-31T00:00:00",
modifiedAfter="2023-12-31T00:00:00"
)
出力
SMA は出力コードに EWI SPRKPY1029
を追加して、この関数がSnowparkでサポートされていることを知らせますが、手動での調整が必要です。Snowparkでサポートされているオプションは、 option
関数呼び出しに変換され、サポートされていないオプションは削除されることに注意してください。これについては、次のセクションで詳しく説明します。
file_paths = [
"path/to/your/file1.parquet",
"path/to/your/file2.parquet",
"path/to/your/file3.parquet"
]
#EWI: SPRKPY1076 => Some of the included parameters are not supported in the parquet function, the supported ones will be added into a option method.
#EWI: SPRKPY1029 => This issue appears when the tool detects the usage of pyspark.sql.readwriter.DataFrameReader.parquet. This function is supported, but some of the differences between Snowpark and the Spark API might require making some manual changes.
df = session.read.option("PATTERN", "*file*").parquet(
*file_paths
)
推奨される修正
このセクションでは、 path
および option
パラメーターをSnowparkで動作するように構成する方法を説明します。
1. パスパラメーター
Sparkでは、このパラメーターの場所はローカルでもクラウドでもかまいません。Snowparkでは、 Snowflakeステージ を使用したクラウドロケーションのみを受け付けています。そこで、テンポラルステージを作成し、プレフィックス file://
を使って各ファイルをそこに追加します。
2. オプションパラメーター
Snowparkでは、 parquet
関数のパラメーターとして、 option を定義することはできません。回避策として、 option または options 関数を使用して、これらのパラメーターを DataFrameReader の追加オプションとして指定することができます。
Snowpark options と PySpark options は完全には同じではないため、手動で変更することが必要になる場合があります。以下は、Snowparkで最も一般的な PySpark オプションの構成方法の詳細です。
2.1 mergeSchemaオプション
Parquetはスキーマの進化をサポートしており、ユーザーはシンプルなスキーマから始めて、必要に応じて徐々に列を追加していくことができます。その結果、異なるが互換性のあるスキーマを持つ複数のparquetファイルができる可能性があります。Snowflakeでは、 infer_schema 機能のおかげでその必要はなく、したがって mergeSchema
オプションは削除するだけです。
2.2 pathGlobFilter オプション
ステージからファイルのサブセットだけを読み込む場合は、 pattern
オプションを使って、読み込むファイルに一致する正規表現を指定することができます。このシナリオの出力でわかるように、 SMA はすでにこれを自動化しています。
2.3 recursiveFileLookupstr オプション
このオプションはSnowparkではサポートされていません。最もお勧めなのは、 pathGlobFilter
オプションのような正規表現を使って、似たようなことを実現することです。
2.4 modifiedBefore / modifiedAfterオプション
Snowflakeでは、 metadata
列を使用すると、同じ結果を得ることができます。
注釈
以下のオプションはSnowparkではサポートされていません。
compression
datetimeRebaseMode
int96RebaseMode
mergeSchema
以下は、Snowparkで動作させるために入力コードをどのように変換すべきかの包括的な例です。
from snowflake.snowpark.column import METADATA_FILE_LAST_MODIFIED, METADATA_FILENAME
temp_stage = f'{session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {temp_stage}')
session.file.put(f"file:///path/to/your/file1.parquet", f"@{temp_stage}")
session.file.put(f"file:///path/to/your/file2.parquet", f"@{temp_stage}")
session.file.put(f"file:///path/to/your/file3.parquet", f"@{temp_stage}")
df = session.read \
.option("PATTERN", ".*file.*") \
.with_metadata(METADATA_FILENAME, METADATA_FILE_LAST_MODIFIED) \
.parquet(temp_stage) \
.where(METADATA_FILE_LAST_MODIFIED < '2024-12-31T00:00:00') \
.where(METADATA_FILE_LAST_MODIFIED > '2023-12-31T00:00:00')
その他の推奨事項¶
Snowflakeでは、parquetデータの取り込みに次のような他のアプローチを活用できます。
native parquet ingestion capabilities の活用。Snowpipeを使用した自動インジェスト も考慮します
クラウドファイルの場所を直接指定できるParquet 外部テーブル。
Icebergテーブル の使用
移行の際には、 SMA のレポートを活用してファイルのインベントリを作成し、モダナイゼーション後にどのステージ/テーブルにデータがマッピングされるかを決定するのが良い方法です。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1039¶
警告
この問題コードは、 廃止 されました。
メッセージ: pyspark.sql.column.Column.getItem has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.column.Column.getItem 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.column.Column.getItem
関数の使用例です。この例では、 getItem
関数を使用して、位置とキーによってアイテムを取得しています。
df = spark.createDataFrame([(1, ["apple", "banana", "orange"]), (2, ["carrot", "avocado", "banana"])], ["id", "fruits"])
df.withColumn("first_fruit", col("fruits").getItem(0))
df = spark.createDataFrame([(1, {"apple": 10, "banana": 20}), (2, {"carrot": 15, "grape": 25}), (3, {"pear": 30, "apple": 35})], ["id", "fruit_quantities"])
df.withColumn("apple_quantity", col("fruit_quantities").getItem("apple"))
出力
SMA は出力コードに EWI SPRKPY1039
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
df = spark.createDataFrame([(1, ["apple", "banana", "orange"]), (2, ["carrot", "avocado", "banana"])], ["id", "fruits"])
#EWI: SPRKPY1039 => pyspark.sql.column.Column.getItem has a workaround, see documentation for more info
df.withColumn("first_fruit", col("fruits").getItem(0))
df = spark.createDataFrame([(1, {"apple": 10, "banana": 20}), (2, {"carrot": 15, "grape": 25}), (3, {"pear": 30, "apple": 35})], ["id", "fruit_quantities"])
#EWI: SPRKPY1039 => pyspark.sql.column.Column.getItem has a workaround, see documentation for more info
df.withColumn("apple_quantity", col("fruit_quantities").getItem("apple"))
推奨される修正
回避策として、フィールドの名前または位置をインデックスとして Snowpark列インデクサー演算子 を使用することができます。
df = spark.createDataFrame([(1, ["apple", "banana", "orange"]), (2, ["carrot", "avocado", "banana"])], ["id", "fruits"])
df.withColumn("first_fruit", col("fruits")[0])
df = spark.createDataFrame([(1, {"apple": 10, "banana": 20}), (2, {"carrot": 15, "grape": 25}), (3, {"pear": 30, "apple": 35})], ["id", "fruit_quantities"])
df.withColumn("apple_quantity", col("fruit_quantities")["apple"])
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1068¶
メッセージ: toPandas contains columns of type ArrayType that is not supported and has a workaround.
カテゴリ: 警告
説明¶
タイプ ArrayType の列がある場合は、 pyspark.sql.DataFrame.toPandas が正しく動作しません。このような場合の回避策は、json.loadsメソッドを使って列をPython Dictionaryに変換することです。
シナリオ¶
入力
ToPandas は、元の DataFrame のデータをPandas DataFrame として返します。
sparkDF = spark.createDataFrame([
Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0))
])
pandasDF = sparkDF.toPandas()
出力
ツールはこの EWI を追加して、 ArrayType のタイプの列がある場合に、toPandasがサポートされていないことを知らせますが、回避策があります。
sparkDF = spark.createDataFrame([
Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0))
])
#EWI: SPRKPY1068 => toPandas doesn't work properly If there are columns of type ArrayType. The workaround for these cases is converting those columns into a Python Dictionary by using json.loads method. example: df[colName] = json.loads(df[colName]).
pandasDF = sparkDF.toPandas()
推奨される修正
pandas_df = sparkDF.toPandas()
## check/convert all resulting fields from calling toPandas when they are of
## type ArrayType,
## they will be reasigned by converting them into a Python Dictionary
## using json.loads method
for field in pandas_df.schema.fields:
if isinstance(field.datatype, ArrayType):
pandas_df[field.name] = pandas_df[field.name].apply(lambda x: json.loads(x) if x is not None else x)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1048¶
警告
この問題コードは、 Spark Conversion Core Version 2.4.0 以降 廃止 されています
メッセージ: pyspark.sql.session.SparkSession.conf has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.session.SparkSession.conf の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は conf
プロパティに構成を設定する方法の例です。
spark.conf.set("spark.sql.crossJoin.enabled", "true")
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1048
を追加します。
#EWI: SPRKPY1048 => pyspark.sql.session.SparkSession.conf has a workaround, see documentation for more info
spark.conf.set("spark.sql.crossJoin.enabled", "true")
推奨される修正
SparkSession.confはPysparkでのみ使用される特定の設定を渡すために使用され、Snowparkには適用されません。コードを削除したり、コメントしたりすることができます
#spark.conf.set("spark.sql.crossJoin.enabled", "true")
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1019¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ: pyspark.sql.functions.datediff has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.datediff の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、「today」と他の日付の差分を計算するためにdatediffを使用しています。
contacts = (contacts
#days since last event
.withColumn('daysSinceLastEvent', datediff(lit(today),'lastEvent'))
#days since deployment
.withColumn('daysSinceLastDeployment', datediff(lit(today),'lastDeploymentEnd'))
#days since online training
.withColumn('daysSinceLastTraining', datediff(lit(today),'lastTraining'))
#days since last RC login
.withColumn('daysSinceLastRollCallLogin', datediff(lit(today),'adx_identity_lastsuccessfullogin'))
#days since last EMS login
.withColumn('daysSinceLastEMSLogin', datediff(lit(today),'vms_lastuserlogin'))
)
出力
SMA は、datediffが使用された行に EWI SPRKPY1019 を返すため、修正箇所を識別するのに使用できます。
from pyspark.sql.functions import datediff
#EWI: SPRKPY1019 => pyspark.sql.functions.datediff has a workaround, see documentation for more info
contacts = (contacts
#days since last event
.withColumn('daysSinceLastEvent', datediff(lit(today),'lastEvent'))
#days since deployment
.withColumn('daysSinceLastDeployment', datediff(lit(today),'lastDeploymentEnd'))
#days since online training
.withColumn('daysSinceLastTraining', datediff(lit(today),'lastTraining'))
#days since last RC login
.withColumn('daysSinceLastRollCallLogin', datediff(lit(today),'adx_identity_lastsuccessfullogin'))
#days since last EMS login
.withColumn('daysSinceLastEMSLogin', datediff(lit(today),'vms_lastuserlogin'))
)
SMA は、pyspark.sql.functions.datediffを Snowflake.snowpark.functions.daydiff に変換し、2つの日付間における日数の差も計算します。
推奨される修正
datediff(part: string ,end: ColumnOrName, start: ColumnOrName)
アクション: Snowflake.snowpark.functionsをインポートします。これには、 日付の時間部分 に追加のパラメーターを必要とする datediff 関数の実装が含まれており、日付間の差の計算をより多用途に行えるようにします。
from snowflake.snowpark import Session
from snowflake.snowpark.functions import datediff
contacts = (contacts
#days since last event
.withColumn('daysSinceLastEvent', datediff('day', lit(today),'lastEvent'))
#days since deployment
.withColumn('daysSinceLastDeployment', datediff('day',lit(today),'lastDeploymentEnd'))
#days since online training
.withColumn('daysSinceLastTraining', datediff('day', lit(today),'lastTraining'))
#days since last RC login
.withColumn('daysSinceLastRollCallLogin', datediff('day', lit(today),'adx_identity_lastsuccessfullogin'))
#days since last EMS login
.withColumn('daysSinceLastEMSLogin', datediff('day', lit(today),'vms_lastuserlogin'))
)
推奨¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1009¶
メッセージ : pyspark.sql.dataframe.DataFrame.approxQuantile has a workaround
カテゴリ : 警告。
説明¶
この問題は、 pyspark.sql.dataframe.DataFrame.approxQuantile の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
Pysparkでは2つの異なるapproxQuantile関数が使用されることを理解しておくのは重要です。ここでは、 DataFrame approxQuantile バージョンを使用します
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
data = [['Sun', 10],
['Mon', 64],
['Thr', 12],
['Wen', 15],
['Thu', 68],
['Fri', 14],
['Sat', 13]]
columns = ['Day', 'Ammount']
df = spark.createDataFrame(data, columns)
df.approxQuantile('Ammount', [0.25, 0.5, 0.75], 0)
出力
SMA は、approxQuantileが使用された行に EWI SPRKPY1009 を返すため、修正箇所を識別するのに使用できます。
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
spark.update_query_tag({"origin":"sf_sit","name":"sma","version":{"major":0,"minor":0,"patch":0},"attributes":{"language":"Python"}})
data = [['Sun', 10],
['Mon', 64],
['Thr', 12],
['Wen', 15],
['Thu', 68],
['Fri', 14],
['Sat', 13]]
columns = ['Day', 'Ammount']
df = spark.createDataFrame(data, columns)
#EWI: SPRKPY1009 => pyspark.sql.dataframe.DataFrame.approxQuantile has a workaround, see documentation for more info
df.approxQuantile('Ammount', [0.25, 0.5, 0.75], 0)
推奨される修正
Snowpark approxQuantile メソッドを使用します。いくつかのパラメーターが一致しないため、手動での調整が必要です。出力コードの例では、推奨される修正は次のようになります。
from snowflake.snowpark import Session
...
df = spark.createDataFrame(data, columns)
df.stat.approx_quantile('Ammount', [0.25, 0.5, 0.75])
SnowPark には、 DataFrame.approxQuantileのrelativeErrorパラメーターが存在しません。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1058¶
メッセージ: < method > with < key > Platform specific key is not supported.
カテゴリ: ConversionError
説明¶
pyspark.sql.conf.RuntimeConfig からの get
と set
メソッドは、プラットフォーム固有のキーではサポートされていません。
シナリオ¶
get
や set
メソッドを使用すると、必ず出力コードに EWI が追加されるというわけではありません。この EWI は、サポートされていないプラットフォーム固有のキーでこれらのメソッドの使用をツールが検出した場合に表示されます。
シナリオ1¶
入力
以下は、Snowparkでサポートされているキーを使用した、 get
または set
メソッドの例です。
session.conf.set("use_constant_subquery_alias", False)
spark.conf.set("sql_simplifier_enabled", True)
session.conf.get("use_constant_subquery_alias")
session.conf.get("use_constant_subquery_alias")
出力
Snowparkではキーがサポートされているため、ツールは出力コードに EWI を追加しません。
session.conf.set("use_constant_subquery_alias", True)
session.conf.set("sql_simplifier_enabled", False)
session.conf.get("use_constant_subquery_alias")
session.conf.get("sql_simplifier_enabled")
推奨される修正
このシナリオに対する推奨される修正はありません。
シナリオ2¶
入力
以下はサポートされていないキーを使用した例です。
data =
[
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
session.conf.set("spark.sql.shuffle.partitions", "50")
spark.conf.set("spark.yarn.am.memory", "1g")
session.conf.get("spark.sql.shuffle.partitions")
session = spark.conf.get("spark.yarn.am.memory")
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
出力
ツールは出力コードにこの EWI SPRKPY1058
を追加して、これらのメソッドがプラットフォーム固有のキーではサポートされていないことを知らせます。
data =
[
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
#EWI: SPRKPY1058 => pyspark.sql.conf.RuntimeConfig.set method with this "spark.sql.shuffle.partitions" Platform specific key is not supported.
spark.conf.set("spark.sql.shuffle.partitions", "50")
#EWI: SPRKPY1058 => pyspark.sql.conf.RuntimeConfig.set method with this "spark.yarn.am.memory" Platform specific key is not supported.
spark.conf.set("spark.yarn.am.memory", "1g")
#EWI: SPRKPY1058 => pyspark.sql.conf.RuntimeConfig.get method with this "spark.sql.shuffle.partitions" Platform specific key is not supported.
spark.conf.get("spark.sql.shuffle.partitions")
#EWI: SPRKPY1058 => pyspark.sql.conf.RuntimeConfig.get method with this "spark.yarn.am.memory" Platform specific key is not supported.
spark.conf.get("spark.yarn.am.memory")
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
推奨される修正
推奨される修正は、これらのメソッドを削除することです。
data =
[
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1049¶
警告
この問題コードは、 Spark Conversion Core Version 2.1.9 以降 廃止 されています
メッセージ: pyspark.sql.session.SparkSession.sparkContext has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.session.SparkSession.sparkContext の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、Sparkセッションを作成し、 SparkContext
プロパティを使ってappNameを表示する例です。
print("APP Name :"+spark.sparkContext.appName())
出力
このツールは、回避策が実装可能であることを示す EWI SPRKPY1049
を追加します。
#EWI: SPRKPY1049 => pyspark.sql.session.SparkSession.sparkContext has a workaround, see documentation for more info
print("APP Name :"+spark.sparkContext.appName())
推奨される修正
SparkContext は、 SnowPark ではサポートされていませんが、 SparkContext のメソッドやプロパティにセッションインスタンスから直接アクセスすることができます。
## Pyspark
print("APP Name :"+spark.sparkContext.appName())
can be used in SnowPark removing the sparkContext as:
#Manual adjustment in SnowPark
print("APP Name :"+spark.appName());
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1018¶
警告
この問題コードは、 Spark Conversion Core Version 4.8.0 以降 廃止 されています
メッセージ: pyspark.sql.functions.date_sub has a workaround
カテゴリ: 警告。
説明¶
この問題は、 pyspark.sql.functions.date_sub の使用をツールが検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
この例では、date_addを使用して、dataframe dfのために現在の日付から5日前の日付を計算しています。
col = df.select(date_sub(df.colName, 5))
出力
SMA は、date_subが使用された行に EWI SPRKPY1018 を返すため、修正箇所を識別するのに使用できます。
#EWI: SPRKPY1018 => pyspark.sql.functions.date_sub has a workaround, see documentation for more info
col = df.select(date_sub(df.colName, 5))
推奨される修正
date_sub 関数の実装を含むSnowflake.snowpark.functionsをインポートします。
from pyspark.sql.functions import date_sub
df.withColumn("date", date_sub(df.colName, 5))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1008¶
メッセージ: pyspark.sql.context.HiveContext is not required
カテゴリ: 警告。
説明¶
この問題は、不要な pyspark.sql.context.HiveContext の使用をツールが検出した場合に発生します。
シナリオ¶
入力
この例では、Hiveストアへの接続を作成する例を示します。
from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
df = hive_context.table("myTable")
df.show()
出力
SnowflakeにはHiveストアが存在しないため、Hiveコンテキストは必要ありません。Snowflakeでもparquetファイルを使用することができます。方法については、この チュートリアル をご確認ください。
#EWI: SPRKPY1008 => pyspark.sql.context.HiveContext is not required
hive_context = sc
df = hive_context.table("myTable")
df.show()
sc変数は Snow Parkセッションオブジェクト を参照します。
推奨される修正
この例の出力コードでは、次のコードと類似した Snow Parkセッションオブジェクト を追加する必要があります。
## Here manually we can add the Snowpark Session object via a json config file called connection.json
import json
from snowflake.snowpark import Session
jsonFile = open("connection.json")
connection_parameter = json.load(jsonFile)
jsonFile.close()
sc = Session.builder.configs(connection_parameter).getOrCreate()
hive_context = sc
df = hive_context.table("myTable")
df.show()
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1059¶
警告
この問題コードは、 Spark Conversion Core Version 2.45.1 以降 廃止 されています
メッセージ: pyspark.storagelevel.StorageLevel has a workaround, see documentation.
カテゴリ: 警告
説明¶
現在、 Snowflakeがストレージを管理している ため、Snowparkで StorageLevel を使用する必要はありません。詳細情報については、 EWI SPRKPY1072 をご参照ください。
その他の推奨事項¶
アプリケーションを最新バージョンにアップグレードします。
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1079¶
メッセージ: The argument of the pyspark.context.SparkContext.setLogLevel function is not a valid PySpark log level
カテゴリ: 警告
説明¶
この問題は、 pyspark.context.SparkContext.setLogLevel 関数が PySpark で有効なログレベルではない引数で使用されていることを SMA が検出し、Snowparkで同等のログレベルを決定できなかった場合に発生します。
シナリオ¶
入力
ここでは、ログレベルに「INVALID_LOG_LEVEL」が使用されていますが、これは有効なPysparkログレベルではありません。
sparkSession.sparkContext.setLogLevel("INVALID_LOG_LEVEL")
出力
SMA がログレベル「INVALID_LOG_LEVEL」を認識できない場合、 SMA が変換するにもかかわらず、 EWI SPRKPY1079 が追加され、問題が発生する可能性があることを示します。
#EWI: SPRKPY1079 => INVALID_LOG_LEVEL is not a valid PySpark log level, therefore an equivalent could not be determined in Snowpark. Valid PySpark log levels are: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN
logging.basicConfig(stream = sys.stdout, level = logging.INVALID_LOG_LEVEL)
推奨される修正
pyspark.context.SparkContext.setLogLevel 関数で使用されているログレベルが、 PySpark または Snowpark で有効なログレベルであることを確認して、再試行してください。
logging.basicConfig(stream = sys.stdout, level = logging.DEBUG)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1028¶
メッセージ: pyspark.sql.readwriter.DataFrameReader.orc has a workaround, see documentation for more info
カテゴリ: 警告
説明¶
この問題は、 pyspark.sql.readwriter.DataFrameReader.orc 関数の使用を SMA が検出した場合に発生します。これには回避策があります。
シナリオ¶
入力
以下は、この EWI を生成する pyspark.sql.readwriter.DataFrameReader.orc
関数の使用例です。この例では、 orc
関数を使用して複数の .orc
ファイルを読み込み、 mergeSchema や recursiveFileLookup などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。
file_paths = [
"path/to/your/file1.orc",
"path/to/your/file2.orc",
"path/to/your/file3.orc",
]
df = session.read.orc(
file_paths,
mergeSchema="True",
recursiveFileLookup="True"
)
出力
SMA は出力コードに EWI SPRKPY1028
を追加して、この関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。
file_paths = [
"path/to/your/file1.orc",
"path/to/your/file2.orc",
"path/to/your/file3.orc",
]
#EWI: SPRKPY1028 => pyspark.sql.readwriter.DataFrameReader.orc has a workaround, see documentation for more info
df = session.read.orc(
file_paths,
mergeSchema="True",
recursiveFileLookup="True"
)
推奨される修正
このセクションでは、 path
パラメーターと、追加 option
をSnowparkで動作するように構成する方法を説明します。
1. パスパラメーター
Snowparkでは、 path パラメーターをステージの場所にする必要があるため、回避策として、仮ステージを作成し、プレフィックス file://
を使用して、各 .orc
ファイルをそのステージに追加することができます。
2. オプションパラメーター
Snowparkでは、 追加オプション を orc
関数のパラメーターとして定義することはできません。回避策として、 Snowflake.snowpark.DataFrameReader.option 関数を使用して、これらのパラメーターを DataFrameReader のオプションとして指定することができます。
注釈
以下のオプションはSnowparkではサポートされていません。
compression
mergeSchema
以下は、Snowparkで動作するように上記の提案を適用した後の入力コードの全体的な例です。
stage = f'{session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {stage}')
session.file.put(f"file:///path/to/your/file1.orc", f"@{stage}")
session.file.put(f"file:///path/to/your/file2.orc", f"@{stage}")
session.file.put(f"file:///path/to/your/file3.orc", f"@{stage}")
df = session.read.option(recursiveFileLookup, "True").orc(stage)
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1038¶
メッセージ: _ spark element _ is not yet recognized
カテゴリ: 変換エラー
説明¶
この問題は、 SMA によって認識されなかった PySpark 要素がソースコードにある場合に発生します。これは、以下のようなさまざまな理由で起こる可能性があります。
PySpark に存在しない要素。
SMA がまだサポートしていない PySpark バージョンで追加された要素。
要素を処理する際の SMA の内部エラー。
これは、認識できない要素に対して SMA が使用する一般的なエラーコードです。
シナリオ¶
入力
以下は、 PySpark に存在しないため、 SMA で認識できなかった関数の使用例です。
from pyspark.sql import functions as F
F.unrecognized_function()
出力
SMA は出力コードに EWI SPRKPY1038
を追加して、この要素が認識できなかったことを知らせます。
from snowflake.snowpark import functions as F
#EWI: SPRKPY1038 => pyspark.sql.functions.non_existent_function is not yet recognized
F.unrecognized_function()
推奨される修正
問題の識別を試みるために、以下を検証します。
PySpark に要素が存在するかどうかを確認します。
要素のスペルが正しいかどうかを確認します。
SMA でサポートされている PySpark バージョンを使用しているか確認します。SMA を実行する時点で SMA がサポートしている PySpark バージョンを知るには、
DetailedReport.docx
ファイルの最初のページを確認します。
これが有効な PySpark 要素である場合は、 SMA の 問題を報告する オプションを使用して、その特定の要素で変換エラーが発生したことを報告し、役に立つと思われる追加情報を含めます。
SMA で認識できなかった要素があるからといって、Snowparkでサポートされないとは限らないことに注意してください。Snowparkドキュメント を参照して、同等の要素が存在するかどうかを検証する必要があります。
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。
SPRKPY1069¶
メッセージ: If partitionBy parameter is a list, Snowpark will throw an error.
カテゴリ: 警告
説明¶
pyspark.sql.readwriter.DataFrameWriter.parquet メソッドの使用で、パラメーターが partitionBy
の場合、ツールは EWI を表示します。
これは、Snowparkでは DataFrameWriter.parquet は ColumnOrSqlExpr
partitionByパラメーターしかサポートしていないためです。
シナリオ¶
シナリオ1¶
入力コード:
このシナリオでは、partitionByパラメーターはリストではありません。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.write.parquet(file_path, partitionBy="age")
出力コード:
このツールは EWI SPRKPY1069
を追加して、パラメーターがリストの場合はSnowparkがエラーを投げることを知らせます。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
#EWI: SPRKPY1069 => If partitionBy parameter is a list, Snowpark will throw and error.
df.write.parquet(file_path, partition_by = "age", format_type_options = dict(compression = "None"))
推奨される修正
このシナリオに対する推奨される修正はありません。partitionByパラメーターがリストである可能性を考慮して、ツールはこの EWI を常に追加するからです。Snowparkでは、 Snowflakeステージ を使用したクラウドロケーションのみを受け付けることを念頭に置く必要があります。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
stage = f'{Session.get_fully_qualified_current_schema()}.{_generate_prefix("TEMP_STAGE")}'
Session.sql(f'CREATE TEMPORARY STAGE IF NOT EXISTS {stage}').show()
Session.file.put(f"file:///path/to/data/file.parquet", f"@{stage}")
df.write.parquet(stage, partition_by = "age", format_type_options = dict(compression = "None"))
シナリオ2¶
入力コード:
このシナリオでは、partitionByパラメーターはリストです。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.write.parquet(file_path, partitionBy=["age", "name"])
出力コード:
このツールは EWI SPRKPY1069
を追加して、パラメーターがリストの場合はSnowparkがエラーを投げることを知らせます。
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
#EWI: SPRKPY1069 => If partitionBy parameter is a list, Snowpark will throw and error.
df.write.parquet(file_path, partition_by = ["age", "name"], format_type_options = dict(compression = "None"))
推奨される修正
パラメーターの値が リスト
の場合は、 ColumnOrSqlExpr
に置き換えます。
df.write.parquet(file_path, partition_by = sql_expr("age || name"), format_type_options = dict(compression = "None"))
その他の推奨事項¶
詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。