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

入力

以下は、メソッドオプションの使用例です。現在 サポートされている sepnullValue というオプションを追加しています。

df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])

df.write.options(nullValue="myVal", sep=",").csv("some_path")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

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")
Copy
シナリオ2

入力

ここでは、シナリオはオプションの使用を示していますが、 ヘッダー オプションを追加しています。これは サポートされていません

df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])

df.write.options(header=True, sep=",").csv("some_path")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

このシナリオでは、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")
Copy
シナリオ3

入力

このシナリオでは、 sep オプションを追加します。これは、 サポートされて おり、 JSON メソッドを使用します。

df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])

df.write.options(nullValue="myVal", sep=",").json("some_path")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

ファイル形式 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")
Copy

その他の推奨事項

  • サポートされていない パラメーターもあるため、 等価表 を確認し、変換後の動作を確認することをお勧めします。

  • 等価表:

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")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

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")
Copy
シナリオ2

入力

ここでは、シナリオはオプションの使用を示していますが、 ヘッダー オプションを追加しています。これは サポートされていません

df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])

df.write.option("header", True).csv("some_path")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

このシナリオでは、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")
Copy
シナリオ3

入力

このシナリオでは、 sep オプションを追加します。これは、 サポートされて おり、 JSON メソッドを使用します。

  • ノート: このシナリオは PARQUET にも当てはまります。

df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])

df.write.option("sep", ",").json("some_path")
Copy

出力

ツールは、必須の検証であることを示す 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")
Copy

推奨される修正

ファイル形式 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")
Copy

その他の推奨事項

  • サポートされていない パラメーターもあるため、 等価表 を確認し、変換後の動作を確認することをお勧めします。

  • 等価表:

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)
Copy

出力

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)
Copy

推奨される修正

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])
Copy

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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、 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"))
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1074

メッセージ: File has mixed indentation (spaces and tabs).

カテゴリ: 解析エラー。

説明

この問題は、ファイルにインデントが混在していることをツールが検出した場合に発生します。つまり、ファイルには空白とタブを組み合わせてインデントしたコード行があります。

シナリオ

入力

Pysparkでは、インデントレベルに空白とタブを混合することができます。

def foo():
    x = 5 # spaces
    y = 6 # tab
Copy

出力

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
Copy

推奨される修正

解決策は、すべてのインデント記号を同じにすることです。

def foo():
  x = 5 # tab
  y = 6 # tab
Copy

その他の推奨事項

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))
Copy

出力

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))
Copy

推奨される修正

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))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力

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")
Copy

推奨される修正

回避策としては、代わりにSnowpark DataFrameWriter SaveAsTable メソッドを使用します。

df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
                                 schema=["FIRST_NAME", "LAST_NAME"])

df.write.saveAsTable("Personal_info")
Copy

その他の推奨事項

  • 詳しいサポートについては、 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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、 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"))
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1064

メッセージ: The _ Spark element _ does not apply since snowflake uses snowpipe mechanism instead.

カテゴリ: 警告

説明

この問題は、pyspark.streamingライブラリのいずれかの要素の使用をツールが検出した場合に発生します。

シナリオ

入力

以下は、この 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()
Copy

出力

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()
Copy

推奨される修正

SMA は、インポートステートメントを削除し、 Issues.csv インベントリに問題を追加し、Spark要素の使用を削除します。

df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.show()
Copy

その他の推奨事項

  • 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")
Copy

出力

このツールは、回避策が実装可能であることを示す 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")
Copy

推奨される修正

SparkConf.setは、Pysparkでのみ使用される構成設定を設定するために使用され、Snowparkには適用されません。コードを削除したり、コメントしたりすることができます

#conf.set("spark.storage.memoryFraction", "0.5")
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1001

メッセージ : This code section has parsing errors

カテゴリ : 解析エラー。

説明

解析エラーは、Snowpark Migration Accelerator(SMA)がファイル内のコードを正しく読み取れなかったり、理解できなかったりした場合に報告されます(ファイルを正しく「解析」できませんでした)。この問題コードは、ファイルに1つ以上の解析エラーがある場合に表示されます。

シナリオ

入力: EWI のメッセージは、コードが無効な構文を持つ場合に表示されます。

def foo():
    x = %%%%%%1###1
Copy

出力: 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
Copy

その他の推奨事項

  • ファイルに有効な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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、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"))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力コード:

SMA ツールはモードパラメーターを分析し、値が overwrite であることを確定し、対応するブール値を設定します。

df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
Copy

推奨される修正

このシナリオでは、ツールが対応する変換を実行したため、推奨される修正はありません。

シナリオ2:

入力コード

このシナリオでは、ツールは値が overwrite であることを確認できません。

df.write.csv(file_path, mode=myVal)
Copy

出力コード:

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)
Copy

推奨される修正

パラメーター mode の値を確認し、パラメーター overwrite に正しい値を追加します。

df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力コード

ツールは出力コードにこの 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")
Copy

推奨される修正

回避策としては、代わりに 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")
Copy

以下は、 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")
Copy
  • 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")
Copy
  • options パラメーターの修正。

    • 以下のように、 CSV メソッドの format_type_options パラメーターを使用します。

SparkとSnowparkの間のオプションは同じではありません。この場合、 lineSepdateFormatRECORD_DELIMITERDATE_FORMAT に置き換えられます。 その他の推奨事項 セクションには、すべての等価性の表があります。

以下は、 RECORD_DELIMITERDATE_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)
Copy

シナリオ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")
Copy

出力コード

ツールは出力コードにこの 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")
Copy

推奨される修正

回避策としては、代わりに 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")
Copy

以下は、 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")
Copy
  • 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")
Copy
  • options パラメーターの修正。

    • 以下のように、 CSV メソッドの format_type_options パラメーターを使用します。

SparkとSnowparkの間のオプションは同じではありません。この場合、 dateFormattimestampFormatDATE_FORMATTIMESTAMP_FORMAT に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。

以下は、 DATE_FORMATTIMESTAMP_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)
Copy

シナリオ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")
Copy

出力コード

ツールは出力コードにこの 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")
Copy

推奨される修正

回避策としては、代わりに 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")
Copy

以下は、 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")
Copy
  • 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")
Copy
  • options パラメーターの修正。

    • 以下のように、 CSV メソッドの format_type_options パラメーターを使用します。

SparkとSnowparkの間のオプションは同じではありません。この場合、 pathGlobFilterPATTERN に置き換えられています。 その他の推奨事項 セクションには、すべての等価値の表があります。

以下は、 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)
Copy

その他の推奨事項

  • 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

入力

以下は、関数 splitstrpattern パラメーターのみがある場合の例です。

F.split('col', '\\|')
Copy

出力

ツールは、回避策があることを示す EWI SPRKPY1044 を表示します。

#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|')
Copy

推奨される修正

回避策として、パターンパラメーターを指定して関数 Snowflake.snowpark.functions.lit を呼び出し、それをsplitに送信することができます。

F.split('col', lit('\\|'))
## the result of lit will be sent to the split function
Copy

シナリオ2

入力

以下は、関数 splitstr、パターン、制限 のパラメーターがある場合の別の例です。

F.split('col', '\\|', 2)
Copy

出力

ツールは、回避策があることを示す EWI SPRKPY1044 を表示します。

#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|', 2)
Copy

推奨される修正

このシナリオはサポートされていません。

その他の推奨事項

  • 詳しいサポートについては、 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"]))
Copy

出力

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"]))
Copy

推奨される修正

直接的な「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')))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

いずれの場合(パラメーターがある場合とない場合)でも、 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()
Copy

その他の推奨事項

  • これは不要なパラメーターが削除され、警告コメントが挿入されたものです。ユーザーからの追加アクションは必要ありません。

  • 詳しいサポートについては、 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')
Copy

出力

このツールは、 format メソッドを Csv メソッド呼び出しに変換します。

from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()

df1 = spark.read.csv('/path/to/file')
Copy

推奨される修正

この場合、ツールは 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()
Copy

出力

ツールは、値「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()
Copy

推奨される修正

サポートされていない シナリオについては、読み込もうとしているファイルに依存するため、特定の修正はありません。

シナリオ3

入力

以下の例は、 CSV を渡す歳にツールが format メソッドを変換する方法を示していますが、代わりに変数を使用しています。

from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()

myFormat = 'csv'
df3 = spark.read.format(myFormat).load('/path/to/file')
Copy

出力

ツールはランタイムで変数の値を決定できないため、値""がサポートされていないことを示す 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')
Copy

推奨される修正

回避策として、変数の値をチェックし、 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)
Copy

出力

ツールは、認証コードが異なることを示す 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
Copy

推奨される修正

接続を作成するには、 connection.json ファイルに情報を入力する必要があります。

{
  "user": "<USER>",
  "password": "<PASSWORD>",
  "account": "<ACCOUNT>",
  "role": "<ROLE>",
  "warehouse": "<WAREHOUSE>",
  "database": "<DATABASE>",
  "schema": "<SCHEMA>"
}
Copy

その他の推奨事項

  • 詳しいサポートについては、 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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、 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")))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力:

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()
Copy

推奨される修正

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()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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())
Copy

出力

ツールはこの 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())
Copy

推奨される修正

この関数の使用をすべて削除します。

df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
Copy

その他の推奨事項

  • サポートの詳細については、 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()
Copy

出力

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()
Copy

推奨される修正

回避策としては、代わりに 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()
Copy
  • schema パラメーターの修正。

    • スキーマは スキーマ 関数を使用して以下のように設定できます。

schemaParam = StructType([
        StructField("name", StringType(), True),
        StructField("city", StringType(), True)
    ])

df = my_session.read.schema(schemaParam).csv(temp_stage)
Copy
  • options パラメーターの修正。

SparkとSnowparkの間の オプション は同じではありません。この場合、 lineSepdateFormatRECORD_DELIMITERDATE_FORMAT に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。

以下は、 RECORD_DELIMITERDATE_FORMAT でディクショナリを作成し、そのディクショナリを使って options メソッドを呼び出す例です。

optionsParam = {"RECORD_DELIMITER": "\r\n", "DATE_FORMAT": "YYYY/MM/DD"}
df = my_session.read.options(optionsParam).csv(stage)
Copy

シナリオ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()
Copy

出力

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()
Copy

推奨される修正

回避策としては、代わりに 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()
Copy
  • schema パラメーターの修正。

    • スキーマは スキーマ 関数を使用して以下のように設定できます。

schemaParam = StructType([
        StructField("name", StringType(), True),
        StructField("city", StringType(), True)
    ])

df = my_session.read.schema(schemaParam).json(temp_stage)
Copy
  • options パラメーターの修正。

SparkとSnowparkの間の オプション は同じではありません。この場合、 dateFormattimestampFormatDATE_FORMATTIMESTAMP_FORMAT に置き換えられています。 その他の推奨事項 セクションには、すべての等価性の表があります。

以下は、 DATE_FORMATTIMESTAMP_FORMAT でディクショナリを作成し、そのディクショナリを使って options メソッドを呼び出す例です。

optionsParam = {"DATE_FORMAT": "YYYY/MM/DD", "TIMESTAMP_FORMAT": "YYYY-MM-DD HH24:MI:SS.FF3"}
df = Session.read.options(optionsParam).json(stage)
Copy

シナリオ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()
Copy

出力

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()
Copy

推奨される修正

回避策としては、代わりに 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()
Copy
  • schema パラメーターの修正。

    • スキーマは スキーマ 関数を使用して以下のように設定できます。

schemaParam = StructType([
        StructField("name", StringType(), True),
        StructField("city", StringType(), True)
    ])

df = my_session.read.schema(schemaParam).parquet(temp_stage)
Copy
  • options パラメーターの修正。

SparkとSnowparkの間の オプション は同じではありません。この場合、 pathGlobFilterPATTERN に置き換えられています。 その他の推奨事項 セクションには、すべての等価値の表があります。

以下は、 PATTERN でディクショナリを作成し、そのディクショナリを使って options メソッドを呼び出す例です。

optionsParam = {"PATTERN": "*.parquet"}
df = Session.read.options(optionsParam).parquet(stage)
Copy

その他の推奨事項

  • 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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

回避策として、 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))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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"]))
Copy

出力

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"]))
Copy

推奨される修正

直接の「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')))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

ツールは、キーを正しい等価値で変換します。

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)
Copy

推奨される修正

ツールはキーの値を変換するため、修正する必要はありません。

シナリオ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)
Copy

出力

ツールは、キーがサポートされていないことを示す 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)
Copy

推奨される修正

変換後の動作を確認することをお勧めします。

その他の推奨事項

  • 非等価パラメーターが存在する場合は、変換後の動作を確認することをお勧めします。

  • 詳しいサポートについては、 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()
Copy

出力

この関数 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()
Copy

推奨される修正

回避策として、少なくともタイムスタンプ文字列の名前または列を追加することができます。

data = [["2015-04-08", "10"],["2015-04-10", "15"]]

df = spark.createDataFrame(data, ["dt", "val"])
df.select(unix_timestamp("dt")).show()
Copy

その他の推奨事項

  • また、 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()
Copy

出力

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()
Copy

推奨される修正

回避策として、 appName 関数の拡張機能を提供する snowpark_extensions パッケージをインポートすることができます。

import snowpark_extensions
session = SessionBuilder.appName("MyApp").getOrCreate()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

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)
Copy

推奨される修正

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"
Copy
  • 別の方法として、仮テーブルを使用すると、セッション終了後にテーブルが削除されるという利点があります。

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"
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1101

カテゴリ

解析エラー。

説明

ツールが解析エラーを認識すると、そのエラーから回復しようとし、次の行で処理を続行します。これらの場合、行にエラーとコメントが表示されます。

この例では、スペースとタブの不一致エラーがどのように処理されるかを示しています。

入力コード

def foo():
    x = 5 # Spaces
	y = 6 # Tab

def foo2():
    x=6
    y=7
Copy

出力コード

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
Copy

推奨事項

  • コメントされている行を修正してみてください。

  • サポートの詳細については、 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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

回避策として、 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()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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))
Copy

出力

#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))
Copy

from_json関数では、スキーマは推論のために渡されるのではなく、検証のために使われます。この例をご参照ください。

data = [
    ('{"name": "John", "age": 30, "city": "New York"}',),
    ('{"name": "Jane", "age": "25", "city": "San Francisco"}',)
]

df = spark.createDataFrame(data, ["json_str"])
Copy

例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
Copy

例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
Copy

推奨事項

  • サポートの詳細については、 sma-support@snowflake.com にメールでお問い合わせください。Snowflakeとサポート契約を結んでいる場合は、セールスエンジニアにご連絡ください。必要なサポートにご案内します。

  • 便利なツール PEP-8Reindent

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"]))
Copy

出力

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"]))
Copy

推奨される修正

回避策として、リテラル値 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"]))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力コード

ツールは出力コードにこの 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)
Copy

推奨される修正

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))
Copy

出力

SMA は出力コードに EWI SPRKPY1034 を追加して、列オブジェクトパラメーターのある desc 関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。

#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc(col))
Copy

推奨される修正

回避策として、列パラメーターから Snowflake.snowpark.Column.desc 関数を呼び出すことができます。

df.orderBy(col.desc())
Copy
シナリオ2

入力

以下は、 pyspark.sql.functions.desc 関数の使用例で、パラメーターとして列名を取ります。

df.orderBy(desc("colName"))
Copy

出力

SMA は出力コードに EWI SPRKPY1034 を追加して、列名パラメーターのある desc 関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。

#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc("colName"))
Copy

推奨される修正

回避策として、 snowflake.snowpark.functions.col 関数を使用して文字列パラメーターを列オブジェクトに変換し、 snowflake.snowpark.Column.desc 関数を呼び出すことができます。

df.orderBy(col("colName").desc())
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力コード

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)
Copy

推奨される修正

使用されているすべてのpyspark.context.SparkContext.broadcastを削除します。

sc = conf_spark

mapping = {1: 10001, 2: 10002}
Copy

その他の推奨事項

  • 詳しいサポートについては、 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]")
Copy

出力

このツールは、回避策が実装可能であることを示す EWI SPRKPY1051 を追加します。

#EWI: SPRKPY1051 => pyspark.sql.session.SparkSession.Builder.master has a workaround, see documentation for more info
spark = Session.builder.master("local[1]")
Copy

推奨される修正

pyspark.sql.session.SparkSession.Builder.master は、Sparkクラスターの設定に使用します。SnowparkはSparkクラスターを使用しないため、コードを削除またはコメントすることができます。

## spark = Session.builder.master("local[1]")
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

このコードは、 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"))
Copy

推奨される修正

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")
Copy

手動で調整した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

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"]))
Copy

出力

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"]))
Copy

推奨される修正

回避策として、 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"]))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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))
Copy

出力

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))
Copy

推奨される修正

date_add (およびエイリアスdateAdd)関数の実装を含むSnowflake.snowpark.functionsをインポートします。

from snowflake.snowpark.functions import date_add

col = df.select(date_add(df.dt, 1))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

ツールバージョンを更新します。

その他の推奨事項

  • 詳しいサポートについては、 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')
Copy

出力

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')
Copy

推奨される修正

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()
Copy

出力

出力コードでは、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
Copy

その他の推奨事項

  • これは不要なパラメーターであるため、ソースコードに警告コメントを挿入して削除します。ユーザーからのアクションはありません。

  • 詳しいサポートについては、 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))
Copy

出力

SMA は出力コードに EWI SPRKPY1033 を追加して、列オブジェクトパラメーターのある asc 関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。

#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc(col))
Copy

推奨される修正

回避策として、列パラメーターから snowflake.snowpark.Column.asc 関数を呼び出すことができます。

df.orderBy(col.asc())
Copy
シナリオ2

入力

以下は、 pyspark.sql.functions.asc 関数の使用例で、パラメーターとして列名を取ります。

df.orderBy(asc("colName"))
Copy

出力

SMA は出力コードに EWI SPRKPY1033 を追加して、列名パラメーターのある asc 関数がSnowparkで直接にはサポートされていないことを知らせますが、回避策があります。

#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc("colName"))
Copy

推奨される修正

回避策として、 snowflake.snowpark.functions.col 関数を使用して文字列パラメーターを列オブジェクトに変換し、 snowflake.snowpark.Column.asc 関数を呼び出すことができます。

df.orderBy(col("colName").asc())
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力

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")
Copy

推奨される修正

このシナリオでは、 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")
Copy
シナリオ2

入力

SMA は、パターン dataFrame.groupBy("columnX").pivot("columnY") に一致する式を検出できず、ピボットには values パラメーターがありません。

df1.union(df2).groupBy("date").pivot("category").sum("amount")
Copy

出力

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")
Copy

推奨される修正

以下のように、ピボット対象となる個別の値のリストを追加します。

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()
Copy

その他の推奨事項

  • ピボットの対象となる明確な値のリストを計算することは、大容量のデータセットでは効率的な操作ではなく、ブロック呼び出しになる可能性があります。ピボットする明確な値のリストを明示的に指定することを検討してください。

  • ピボットする個別の値のリストを明示的に指定しない(非推奨)場合は、ピボット関数の第2引数に以下のコードを追加して、ランタイム時に値を推測することができます*

[v[0] for v in <df>.select(<column>).distinct().limit(<count>).collect()]]
Copy

*<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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

同じ動作をさせるには、 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()
Copy
シナリオ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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

回避策として、 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()
Copy

注意: 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"]))
Copy

出力

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"]))
Copy

推奨される修正

直接の「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')))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力コード

ツールは出力コードにこの 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")
Copy

推奨される修正

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 ファイルを読み込んでいます。また、 primitiveAsStringdateFormat などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。

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"
)
Copy

出力

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"
)
Copy

推奨される修正

このセクションでは、 パス パラメーター、 スキーマ パラメーター、およびいくつかの オプション を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)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

変換後のコードでは、パラメーターは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()
Copy

シナリオ2

入力

以下は JSON 用のいくつかの例です。

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.json("/myPath/jsonFile/", dateFormat='YYYY/MM/DD').show()
Copy

出力

変換後のコードでは、パラメーターは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()
Copy
シナリオ3

入力

以下は PARQUET 用のいくつかの例です。

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()

spark.read.parquet("/path/to/my/file.parquet", pathGlobFilter="*.parquet").show()
Copy

出力

変換後のコードでは、パラメーターは個々のオプションとして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")
Copy

その他の推奨事項

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)
Copy

出力コード

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)
Copy

推奨される修正

要素の使用を削除します。

df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
Copy

その他の推奨事項

  • 詳しいサポートについては、 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))
Copy

出力

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))
Copy

推奨される修正

回避策として、 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))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

Snowparkでは不要なため、 enableHiveSupport 関数の使用を削除します。

spark = Session.builder.appName("Merge_target_table")\
        .config("spark.port.maxRetries","100") \
        .getOrCreate()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

同じ動作をさせるには、 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()
Copy
シナリオ2

入力

以下は、 マップ/ディクショナリ(キー/値) を渡すposexplode_outerの別の使用例です。

df = spark.createDataFrame(
    [
        (1, {"x": 1.0}),
        (2, {}),
        (3, None)],
    ("id", "a_map"))

df.select(posexplode_outer(df.a_map)).show()
Copy

出力

このツールは、回避策が実装可能であることを示す 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()
Copy

推奨される修正

回避策として、 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()
Copy

注意: 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")
Copy

出力

SMA は、 DataFrameStatFunctions.writeToが使用された行に EWI SPRKPY1012 を返すため、修正箇所を識別するのに使用できます。

#EWI: SPRKPY1012 => pyspark.sql.dataframe.DataFrameStatFunctions.writeTo has a workaround, see documentation for more info
writer = df.writeTo("table")
Copy

推奨される修正

代わりに、df.write.SaveAsTable()を使用します。

import df.write as wt
writer = df.write.save_as_table(table)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力コード

ツールは出力コードにこの 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)
Copy

推奨される修正

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 ファイルを読み込んでいます。また、 encodingheadersep などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。

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=","
)
Copy

出力

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=","
)
Copy

推奨される修正

このセクションでは、 パス パラメーター、 スキーマ パラメーター、およびいくつかの オプション を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)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

SMA は、 PySpark.sqlパラメーターが変数であり SQL コードではないことを検出するため、 EWI SPRKPY1077 メッセージが PySpark.sql行に追加されます。

query = f"SELECT * myTable"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
spark.sql(query)
Copy

その他の推奨事項

  • 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))
Copy

出力コード

ツールは出力コードにこの 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))
Copy

推奨される修正

2つのパラメーターのみを持つsplit関数を保持します。

df.select(split(columnName, ","))
Copy
シナリオ2

入力コード

この例では、split関数のパラメーターに正規表現パターンがあります。

df.select(split(columnName, "^([\d]+-[\d]+-[\d])"))
Copy

出力コード

ツールは出力コードにこの 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])"))
Copy

推奨される修正

このメソッド 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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、フィールド名をインデックスとして 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"])
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力

この出力コードでは、 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)
Copy

推奨される修正

構成ファイル「connection.json」を必要な接続情報で更新する必要があります。

{
  "user": "my_user",
  "password": "my_password",
  "account": "my_account",
  "role": "my_role",
  "warehouse": "my_warehouse",
  "database": "my_database",
  "schema": "my_schema"
}
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

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()
Copy

推奨される修正

このシナリオを修正するには、入力と出力の戻り値のタイプのインポートと、 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()
Copy
シナリオ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()
Copy

出力

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()
Copy

推奨される修正

このシナリオを修正するには、入力と出力の戻り値のタイプのインポートと、 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()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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"]))
Copy

出力

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"]))
Copy

推奨される修正

回避策として、リテラル値 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"]))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

SMA は、collect_setが使用された行に EWI SPRKPY1016 を返すため、修正箇所を識別するのに使用できます。

#EWI: SPRKPY1016 => pyspark.sql.functions.collect_set has a workaround, see documentation for more info
col = collect_set(colName)
Copy

推奨される修正

array_agg関数を使用し、値Trueの第2引数を追加します。

col = array_agg(col, True)
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1047

警告

この問題コードは、 Spark Conversion Core Version 4.6.0 以降 廃止 されています

説明

この問題は、 pyspark.context.SparkContext.setLogLevel の使用をツールが検出した場合に発生します。これには回避策があります。

シナリオ

入力

以下は、 setLogLevel メソッドの使用例です。

sparkSession.sparkContext.setLogLevel("WARN")
Copy

出力

このツールは、回避策が実装可能であることを示す EWI SPRKPY1047 を追加します。

#EWI: SPRKPY1047 => pyspark.context.SparkContext.setLogLevel has a workaround, see documentation for more info
sparkSession.sparkContext.setLogLevel("WARN")
Copy

推奨される修正

setLogLevel 関数の使用を logging.basicConfig に置き換えます。この関数は、単純なログの使用のための便利な関数のセットを提供します。これを使うためには、「logging」と「sys」という2つのモジュールをインポートし、「レベル等価表」を使ってレベル定数を置き換える必要があります。

import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.WARNING)
Copy
  • レベル等価表

レベルソースパラメーター

レベルターゲットパラメーター

"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)
Copy

出力

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
Copy

その他の推奨事項

  • これは不要なパラメーターが削除され、警告コメントが挿入されたものです。ユーザーからのアクションはありません。

  • 詳しいサポートについては、 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()
Copy

出力

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()
Copy

推奨される修正

問題の識別を試みるために、以下を検証します。

  • ソースコードの構文が正しいか、スペルが正しいかを確認します。

  • 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)
Copy

出力

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)
Copy

推奨される修正

パラメータータイプを新しいパラメーター 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
Copy

その他の推奨事項

  • 詳しいサポートについては、 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)
Copy

出力

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)
Copy

推奨される修正

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)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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"
)
Copy

出力

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
)
Copy

推奨される修正

このセクションでは、 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')
Copy

その他の推奨事項

  • Snowflakeでは、parquetデータの取り込みに次のような他のアプローチを活用できます。

  • 移行の際には、 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"))
Copy

出力

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"))
Copy

推奨される修正

回避策として、フィールドの名前または位置をインデックスとして 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"])
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

ツールはこの 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()
Copy

推奨される修正

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)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力

このツールは、回避策が実装可能であることを示す 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")
Copy

推奨される修正

SparkSession.confはPysparkでのみ使用される特定の設定を渡すために使用され、Snowparkには適用されません。コードを削除したり、コメントしたりすることができます

#spark.conf.set("spark.sql.crossJoin.enabled", "true")
Copy

その他の推奨事項

  • 詳しいサポートについては、 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'))
           )
Copy

出力

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'))
           )
Copy

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'))
           )
Copy

推奨

  • 詳しいサポートについては、 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)
Copy

出力

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)
Copy

推奨される修正

Snowpark approxQuantile メソッドを使用します。いくつかのパラメーターが一致しないため、手動での調整が必要です。出力コードの例では、推奨される修正は次のようになります。

from snowflake.snowpark import Session
...
df = spark.createDataFrame(data, columns)

df.stat.approx_quantile('Ammount', [0.25, 0.5, 0.75])
Copy

SnowPark には、 DataFrame.approxQuantileのrelativeErrorパラメーターが存在しません。

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。

SPRKPY1058

メッセージ: < method > with < key > Platform specific key is not supported.

カテゴリ: ConversionError

説明

pyspark.sql.conf.RuntimeConfig からの getset メソッドは、プラットフォーム固有のキーではサポートされていません。

シナリオ

getset メソッドを使用すると、必ず出力コードに 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")
Copy

出力

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")
Copy

推奨される修正

このシナリオに対する推奨される修正はありません。

シナリオ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"])
Copy

出力

ツールは出力コードにこの 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"])
Copy

推奨される修正

推奨される修正は、これらのメソッドを削除することです。

data =
    [
      ("John", 30, "New York"),
      ("Jane", 25, "San Francisco")
    ]

df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
Copy

その他の推奨事項

  • 詳しいサポートについては、 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())
Copy

出力

このツールは、回避策が実装可能であることを示す EWI SPRKPY1049 を追加します。

#EWI: SPRKPY1049 => pyspark.sql.session.SparkSession.sparkContext has a workaround, see documentation for more info
print("APP Name :"+spark.sparkContext.appName())
Copy

推奨される修正

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());
Copy

その他の推奨事項

  • 詳しいサポートについては、 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))
Copy

出力

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))
Copy

推奨される修正

date_sub 関数の実装を含むSnowflake.snowpark.functionsをインポートします。

from pyspark.sql.functions import date_sub
df.withColumn("date", date_sub(df.colName, 5))
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

SnowflakeにはHiveストアが存在しないため、Hiveコンテキストは必要ありません。Snowflakeでもparquetファイルを使用することができます。方法については、この チュートリアル をご確認ください。

#EWI: SPRKPY1008 => pyspark.sql.context.HiveContext is not required
hive_context = sc
df = hive_context.table("myTable")
df.show()
Copy

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()
Copy

その他の推奨事項

  • 詳しいサポートについては、 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")
Copy

出力

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)
Copy

推奨される修正

pyspark.context.SparkContext.setLogLevel 関数で使用されているログレベルが、 PySpark または Snowpark で有効なログレベルであることを確認して、再試行してください。

logging.basicConfig(stream = sys.stdout, level = logging.DEBUG)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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 ファイルを読み込み、 mergeSchemarecursiveFileLookup などの追加オプションを使用して、ファイルを読み込む際の動作を微調整しています。

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"
)
Copy

出力

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"
)
Copy

推奨される修正

このセクションでは、 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)
Copy

その他の推奨事項

  • 詳しいサポートについては、 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()
Copy

出力

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()
Copy

推奨される修正

問題の識別を試みるために、以下を検証します。

  • 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.parquetColumnOrSqlExpr partitionByパラメーターしかサポートしていないためです。

シナリオ

シナリオ1

入力コード:

このシナリオでは、partitionByパラメーターはリストではありません。

df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])

df.write.parquet(file_path, partitionBy="age")
Copy

出力コード:

このツールは 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"))
Copy

推奨される修正

このシナリオに対する推奨される修正はありません。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"))
Copy
シナリオ2

入力コード:

このシナリオでは、partitionByパラメーターはリストです。

df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])

df.write.parquet(file_path, partitionBy=["age", "name"])
Copy

出力コード:

このツールは 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"))
Copy

推奨される修正

パラメーターの値が リスト の場合は、 ColumnOrSqlExpr に置き換えます。

df.write.parquet(file_path, partition_by = sql_expr("age || name"), format_type_options = dict(compression = "None"))
Copy

その他の推奨事項

  • 詳しいサポートについては、 sma-support@snowflake.com にメールでお問い合わせいただくか、 SMA 内 に問題を投稿してください。