Snowpark Migration Accelerator: Problemcodes für Python¶
SPRKPY1089¶
Meldung: Die Werte von pyspark.sql.readwriter.DataFrameWriter. options in Snowpark können unterschiedlich sein, so dass eine Validierung erforderlich sein könnte.
Kategorie: Warnung
Beschreibung¶
Die Werte von pyspark.sql.readwriter.DataFrameWriter. options in Snowpark können unterschiedlich sein, so dass eine Validierung erforderlich sein kann, um sicherzustellen, dass die Verhaltensweise korrekt ist.
Szenarien¶
Es gibt einige Szenarien, je nachdem, ob die Optionen unterstützt werden oder nicht oder welches Format zum Schreiben der Datei verwendet wird.
Szenario 1¶
Eingabe
Unten sehen Sie ein Beispiel für die Verwendung der Methodenoptionen, indem Sie die Optionen sep
und nullValue
hinzufügen, die derzeit unterstützt
werden.
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(nullValue="myVal", sep=",").csv("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1089
hinzu und weist darauf hin, dass die Validierung erforderlich ist.
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")
Empfohlene Korrektur
Snowpark API unterstützt diese Parameter, so dass die einzige Maßnahme darin bestehen kann, die Verhaltensweise nach der Migration zu überprüfen. Die unterstützten Parameter entnehmen Sie bitte der Äquivalenzen-Tabelle.
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")
Szenario 2¶
Eingabe
Hier zeigt das Szenario die Verwendung von Optionen, fügt aber eine Header
-Option hinzu, die nicht unterstützt wird
.
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(header=True, sep=",").csv("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1089
hinzu und weist darauf hin, dass eine Validierung erforderlich ist.
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")
Empfohlene Korrektur
Für dieses Szenario empfiehlt es sich, die Optionen des Snowpark-Formats zu prüfen, um zu sehen, ob es möglich ist, es nach Ihren Bedürfnissen zu ändern. Überprüfen Sie auch die Verhaltensweise nach der Änderung.
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")
Szenario 3¶
Eingabe
Dieses Szenario fügt eine sep
-Option hinzu, die unterstützt
wird und die Methode JSON
verwendet.
df = spark.createDataFrame([(1, "myVal")], [2, "myVal2"], [None, "myVal3" ])
df.write.options(nullValue="myVal", sep=",").json("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1089
hinzu und weist darauf hin, dass eine Validierung erforderlich ist.
Hinweis: Dieses Szenario gilt auch für
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")
Empfohlene Korrektur
Das Dateiformat JSON
unterstützt nicht den Parameter sep
. Es wird daher empfohlen, die Optionen des Formattyps von Snowpark zu prüfen, um zu sehen, ob es möglich ist, ihn Ihren Bedürfnissen entsprechend zu ändern. Überprüfen Sie auch die Verhaltensweise nach der Änderung.
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")
Zusätzliche Empfehlungen¶
Da es einige
nicht unterstützte
Parameter gibt, empfiehlt es sich, dieÄquivalenz-Tabelle
zu überprüfen und die Verhaltensweise nach der Transformation zu kontrollieren.Äquivalenzen-Tabelle:
Snowpark kann eine Liste von Äquivalenzen für einige Parameter unterstützen:
PySpark-Option |
SnowFlake-Option |
Unterstützte Dateiformate |
Beschreibung |
---|---|---|---|
SEP |
FIELD_DELIMITER |
CSV |
Ein oder mehrere einzelne Byte- oder Multibyte-Zeichen, die Felder in einer Eingabedatei trennen. |
LINESEP |
RECORD_DELIMITER |
CSV |
Ein oder mehrere Zeichen, die Datensätze in einer Eingabedatei trennen. |
QUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
CSV |
Zeichen, das verwendet wird, um Zeichenfolgen einzuschließen. |
NULLVALUE |
NULL_IF |
CSV |
Zeichenfolge, die zum Konvertieren in und von SQL NULL verwendet wird. |
DATEFORMAT |
DATE_FORMAT |
CSV |
Zeichenfolge, die das Format der Datumswerte in den zu ladenden Datendateien definiert. |
TIMESTAMPFORMAT |
TIMESTAMP_FORMAT |
CSV |
Zeichenfolge, die das Format der Zeitstempelwerte in den zu ladenden Datendateien definiert. |
Wenn der verwendete Parameter nicht in der Liste enthalten ist, gibt API einen Fehler aus.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1088¶
Meldung: Die Werte von pyspark.sql.readwriter.DataFrameWriter.option in Snowpark können unterschiedlich sein, so dass eine Validierung erforderlich sein könnte.
Kategorie: Warnung
Beschreibung¶
Die Werte von pyspark.sql.readwriter.DataFrameWriter.option in Snowpark können unterschiedlich sein, so dass eine Validierung erforderlich sein kann, um sicherzustellen, dass die Verhaltensweise korrekt ist.
Szenarien¶
Es gibt einige Szenarien, je nachdem, ob die Option unterstützt wird oder nicht oder welches Format zum Schreiben der Datei verwendet wird.
Szenario 1¶
Eingabe
Unten sehen Sie ein Beispiel für die Verwendung der method-Option, indem Sie die Option sep
hinzufügen, die derzeit von unterstützt
wird.
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("sep", ",").csv("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1088
hinzu und weist darauf hin, dass die Validierung erforderlich ist.
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")
Empfohlene Korrektur
Die Snowpark API unterstützt diesen Parameter, so dass die einzige Maßnahme darin bestehen kann, die Verhaltensweise nach der Migration zu überprüfen. Die unterstützten Parameter entnehmen Sie bitte der Äquivalenzen-Tabelle.
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")
Szenario 2¶
Eingabe
Hier zeigt das Szenario die Verwendung von Option, fügt aber eine Header
-Option hinzu, die nicht unterstützt
wird.
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("header", True).csv("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1088
hinzu und weist darauf hin, dass eine Validierung erforderlich ist.
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")
Empfohlene Korrektur
Für dieses Szenario empfiehlt es sich, die Optionen des Snowpark-Formats zu prüfen, um zu sehen, ob es möglich ist, es nach Ihren Bedürfnissen zu ändern. Überprüfen Sie auch die Verhaltensweise nach der Änderung.
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")
Szenario 3¶
Eingabe
Dieses Szenario fügt eine sep
-Option hinzu, die unterstützt
wird und die Methode JSON
verwendet.
Hinweis: Dieses Szenario gilt auch für
PARQUET
.
df = spark.createDataFrame([(100, "myVal")], ["ID", "Value"])
df.write.option("sep", ",").json("some_path")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1088
hinzu und weist darauf hin, dass eine Validierung erforderlich ist.
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")
Empfohlene Korrektur
Das Dateiformat JSON
unterstützt nicht den Parameter sep
. Es wird daher empfohlen, die Optionen des Formattyps von Snowpark zu prüfen, um zu sehen, ob es möglich ist, ihn Ihren Bedürfnissen entsprechend zu ändern. Überprüfen Sie auch die Verhaltensweise nach der Änderung.
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")
Zusätzliche Empfehlungen¶
Da es einige
nicht unterstützte
Parameter gibt, empfiehlt es sich, dieÄquivalenz-Tabelle
zu überprüfen und die Verhaltensweise nach der Transformation zu kontrollieren.Äquivalenzen-Tabelle:
PySpark-Option |
SnowFlake-Option |
Unterstützte Dateiformate |
Beschreibung |
---|---|---|---|
SEP |
FIELD_DELIMITER |
CSV |
Ein oder mehrere einzelne Byte- oder Multibyte-Zeichen, die Felder in einer Eingabedatei trennen. |
LINESEP |
RECORD_DELIMITER |
CSV |
Ein oder mehrere Zeichen, die Datensätze in einer Eingabedatei trennen. |
QUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
CSV |
Zeichen, das verwendet wird, um Zeichenfolgen einzuschließen. |
NULLVALUE |
NULL_IF |
CSV |
Zeichenfolge, die zum Konvertieren in und von SQL NULL verwendet wird. |
DATEFORMAT |
DATE_FORMAT |
CSV |
Zeichenfolge, die das Format der Datumswerte in den zu ladenden Datendateien definiert. |
TIMESTAMPFORMAT |
TIMESTAMP_FORMAT |
CSV |
Zeichenfolge, die das Format der Zeitstempelwerte in den zu ladenden Datendateien definiert. |
Wenn der verwendete Parameter nicht in der Liste enthalten ist, gibt API einen Fehler aus.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1011¶
Meldung: pyspark.sql.dataframe.DataFrameStatFunctions.approxQuantile hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.dataframe.DataFrameStatFunctions.approxQuantile erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Es ist wichtig zu verstehen, dass Pyspark zwei verschiedene approxQuantile-Funktionen verwendet. Hier verwenden wir die DataFrameStatFunctions approxQuantile-Version.
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)
Ausgabe
SMA gibt die EWI SPRKPY1011 über die Zeile zurück, in der approxQuantile verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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)
Empfohlene Korrektur
Sie können die approxQuantile-Methode von Snowpark verwenden. Einige Parameter stimmen nicht überein, so dass sie manuell angepasst werden müssen. Für das Beispiel des Ausgabecodes könnte eine empfohlene Korrektur lauten:
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])
pyspark.sql.dataframe.DataFrame.approxQuantile’s relativeError-Parameter existiert nicht in SnowPark.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1040¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.explode hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der Funktion pyspark.sql.functions.explode erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.explode
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die explode
-Funktion verwendet, um eine Zeile pro Array-Element für die numbers-Spalte zu erzeugen.
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"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1040
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie das Paket snowpark_extensions importieren, das eine Erweiterung für die Funktion explode
bietet.
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"))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1074¶
Meldung: Datei hat gemischte Einrückung (Leerzeichen und Tabulatoren).
Kategorie: Parsing-Fehler.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool erkennt, dass die Datei eine gemischte Einrückung hat. Das bedeutet, dass die Datei eine Kombination aus Leerzeichen und Tabulatoren enthält, um Codezeilen einzurücken.
Szenario¶
Eingabe
In Pyspark können Sie Leerzeichen und Tabulatoren für die Identifikationsebene mischen.
def foo():
x = 5 # spaces
y = 6 # tab
Ausgabe
SMA kann nicht mit gemischten Einrückungsmarkierungen umgehen. Wenn dies in einer Python-Code-Datei erkannt wird, fügt SMA die EWI SPRKPY1074 in der ersten Zeile hinzu.
## 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
Empfohlene Korrektur
Die Lösung besteht darin, alle Einrückungssymbole anzugleichen.
def foo():
x = 5 # tab
y = 6 # tab
Zusätzliche Empfehlungen¶
Nützliche Einrückungswerkzeuge PEP-8 und Neu-Einrückung.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
¶
SPRKPY1025¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.ntile hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der Funktion pyspark.sql.functions.ntile erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.functions.ntile
, die diese EWI erzeugt. In diesem Beispiel wird die Funktion ntile
verwendet, um die Zeilen in 3 Buckets zu unterteilen.
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))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1025
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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))
Empfohlene Korrektur
Snowpark hat eine äquivalente ntile-Funktion, allerdings sollte das Argument, das an diese Funktion übergeben wird, eine Spalte sein. Als Problemumgehung können Sie das Literal-Argument mit der Funktion snowflake.snowpark.functions.lit in eine Spalte umwandeln.
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))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1087¶
Meldung: Die pyspark.sql.dataframe.DataFrame.writeTo-Funktion wird nicht unterstützt, aber es eine Problemumgehung gibt.
Kategorie: Warnung.
Beschreibung¶
Die pyspark.sql.dataframe.DataFrame.writeTo-Funktion wird nicht unterstützt. Die Problemumgehung besteht darin, stattdessen die Snowpark DataFrameWriter SaveAsTable-Methode zu verwenden.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.dataframe.DataFrame.writeTo
-Funktion. Der Datenframe df
wird in einen Tabellennamen Personal_info
geschrieben.
df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
schema=["FIRST_NAME", "LAST_NAME"])
df.writeTo("Personal_info")
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1087
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht unterstützt wird, aber eine Problemumgehung besteht.
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")
Empfohlene Korrektur
Die Problemumgehung besteht darin, stattdessen die Snowpark DataFrameWriter SaveAsTable-Methode zu verwenden.
df = spark.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]],
schema=["FIRST_NAME", "LAST_NAME"])
df.write.saveAsTable("Personal_info")
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1035¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.reverse hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.sql.functions.reverse feststellt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.reverse
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die reverse
-Funktion verwendet, um jede Zeichenfolge in der word-Spalte umzukehren.
df = spark.createDataFrame([("hello",), ("world",)], ["word"])
df_reversed = df.withColumn("reversed_word", reverse(df["word"]))
df_reversed = df.withColumn("reversed_word", reverse("word"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1035
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie das Paket snowpark_extensions importieren, das eine Erweiterung für die Funktion reverse
bietet.
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"))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1064¶
Meldung: Das _ Spark element _ wird nicht angewendet, da Snowflake stattdessen den Snowpipe-Mechanismus verwendet.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung eines Elements aus der pyspark.streaming-Bibliothek erkennt:
pyspark.streaming.listener.StreamingListener.
Szenario¶
Eingabe
Nachfolgend sehen Sie ein Beispiel mit einem der Elemente, die diesen EWI auslösen.
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()
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1064
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht anwendbar ist.
#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()
Empfohlene Korrektur
Die SMA entfernt die Importanweisung und fügt die Ausgabe dem Bestand Issues.csv hinzu, wobei alle Verwendungen des Spark-Elements entfernt werden.
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.show()
Zusätzliche Empfehlungen¶
Sehen Sie sich die Dokumentation zu Snowpipe an, um zu sehen, wie es zum aktuellen Szenario passt.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1050¶
Meldung: pyspark.conf.SparkConf. set hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.conf.SparkConf.set erkennt, das eine Problemumgehung bietet.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel, das eine Variable mit conf.set
setzt.
conf = SparkConf().setAppName('my_app')
conf.set("spark.storage.memoryFraction", "0.5")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1050
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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")
Empfohlene Korrektur
SparkConf.set wird verwendet, um eine Konfigurationseinstellung zu setzen, die nur von Pyspark verwendet wird und nicht für Snowpark gilt. Sie können den Code entfernen oder kommentieren
#conf.set("spark.storage.memoryFraction", "0.5")
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1001¶
Meldunge : Dieser Codeabschnitt hat Parsing-Fehler
Kategoriey : Parsing-Fehler.
Beschreibung¶
Ein Parsing-Fehler wird vom Snowpark Migration Accelerator (SMA) gemeldet, wenn er den Code in einer Datei nicht richtig lesen oder verstehen kann (er kann die Datei nicht richtig „parsen“). Dieser Problemcode wird angezeigt, wenn eine Datei einen oder mehrere Parsing-Fehler aufweist.
Szenario ¶
Eingabe: Die EWI-Meldung wird angezeigt, wenn der Code eine ungültige Syntax hat, zum Beispiel:
def foo():
x = %%%%%%1###1
Ausgabe: SMA Finden Sie einen Parsing-Fehler und kommentieren Sie den Parsing-Fehler, indem Sie die entsprechende EWI-Meldung hinzufügen:
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
Zusätzliche Empfehlungen ¶
Prüfen Sie, ob die Datei gültigen Python-Code enthält. (Sie können die issues.csv-Datei verwenden, um alle Dateien mit diesem EWI-Code zu finden, um festzustellen, welche Datei(en) aufgrund eines oder mehrerer Parsing-Fehler nicht von dem Tool verarbeitet wurden) Viele Parsing-Fehler treten auf, weil nur ein Teil des Codes in das Tool eingegeben wird. Daher ist es wichtig, dass Sie sicherstellen, dass der Code im Quelltext ausgeführt wird. Wenn er gültig ist, melden Sie einen Parsing-Fehler mit der Option „Problem melden“ in SMA. Fügen Sie die Codezeile, die einen Parsing-Fehler verursacht hat, in die Beschreibung ein, wenn Sie dieses Problem melden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1021¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.last hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.sql.functions.last feststellt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.last
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die Funktion last
verwendet, um den letzten Wert für jeden Namen zu erhalten.
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"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1021
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie die Snowflake LAST_VALUE-Funktion verwenden. Um diese Funktion von Snowpark aus aufzurufen, verwenden Sie die Funktion snowflake.snowpark.functions.call_builtin und übergeben die last_value
-Zeichenfolge als erstes Argument und die entsprechende Spalte als zweites Argument. Wenn Sie den Namen der Spalte in der last
-Funktion verwendet haben, sollten Sie ihn beim Aufruf der call_builtin
-Funktion in eine Spalte umwandeln.
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"))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
Beschreibung: >- Der mode
-Parameter in den Methoden von CSV, JSON und PARQUET wird in overwrite
umgewandelt.
SPRKPY1070¶
Meldung: Das Argument mode
wird in overwrite
umgewandelt. Prüfen Sie den Variablenwert und setzen Sie den entsprechenden boolschen Wert.
Kategorie: Warnung
Beschreibung¶
Wenn es eine Verwendung von gibt:
Das Tool analysiert den Parameter mode
, um festzustellen, ob der Wert overwrite
werden soll.
Szenarien¶
Szenario 1¶
Eingabecode
Für dieses Szenario erkennt das Tool, dass der mode-Parameter den entsprechenden boolschen Wert setzen kann.
df.write.csv(file_path, mode="overwrite")
Ausgabecode:
Das SMA-Tool analysiert den mode-Parameter, stellt fest, dass der Wert overwrite
ist und setzt den entsprechenden boolschen Wert
df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
Empfohlene Korrektur
Für dieses Szenario gibt es keine empfohlene Korrektur, da das Tool die entsprechende Transformation durchgeführt hat.
Szenario 2:
Eingabecode
In diesem Szenario kann das Tool nicht überprüfen, ob der Wert overwrite
ist.
df.write.csv(file_path, mode=myVal)
Ausgabecode:
Die SMA fügt eine EWI-Meldung hinzu, die darauf hinweist, dass der mode-Parameter in ‚overwrite‘ umgewandelt wurde. Sie soll Sie aber auch darauf hinweisen, dass es besser ist, den Variablenwert zu überprüfen und den richtigen boolschen Wert zu setzen.
#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)
Empfohlene Korrektur
Überprüfen Sie den Wert des mode
-Parameters, und fügen Sie den richtigen Wert für den overwrite
-Parameter hinzu.
df.write.csv(file_path, format_type_options = dict(compression = "None"), overwrite = True)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1083¶
Meldung: Die pyspark.sql.readwriter.DataFrameWriter.save-Funktion wird nicht unterstützt. Eine Problemumgehung besteht darin, stattdessen die Snowpark DataFrameWriter copy_into_location-Methode zu verwenden.
Kategorie: Warnung
Beschreibung¶
Die pyspark.sql.readwriter.DataFrameWriter.save-Funktion wird nicht unterstützt. Die Problemumgehung besteht darin, stattdessen die Snowpark DataFrameWriter-Methoden zu verwenden.
Szenarien¶
Die Spark-Signatur für diese Methode DataFrameWriter.save(path, format, mode, partitionBy, **options)
existiert nicht in Snowpark. Daher wird jede Verwendung der Ladefunktion eine EWI im Ausgabecode haben.
Szenario 1¶
Eingabecode
Nachfolgend sehen Sie ein Beispiel, in dem versucht wird, Daten im CSV
-Format zu speichern.
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")
Ausgabecode
Das Tool fügt diese EWI SPRKPY1083
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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")
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameWriter-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die Methode
load
durch die Methode csv oder copy_into_location.Wenn Sie die
copy_into_location
- Methode verwenden, müssen Sie das Format mit dem Parameterfile_format_type
angeben.Der erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, in dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird eine der oben genannten Methoden aufgerufen.
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")
Korrigieren des
Modus
-Parameters:Verwenden Sie die mode-Funktion von Snowpark DataFrameWriter wie folgt:
Nachfolgend finden Sie ein Beispiel, das die Methode mode
mit overwrite
als ein Parameter in die Verkettung einfügt.
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")
Korrigieren des
partitionBy
-Parameters:Verwenden Sie den Parameter partition_by aus der
CSV
-Methode wie folgt:
Nachfolgend finden Sie ein Beispiel, das den partition_by
-Parameter aus der CSV
-Methode verwendet.
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")
Korrigieren des
options
-Parameters:Verwenden Sie den format_type_options-Parameter aus der
CSV
-Methode wie folgt:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall werden lineSep
und dateFormat
durch RECORD_DELIMITER
und DATE_FORMAT
ersetzt, der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, bei dem ein Dictionary mit RECORD_DELIMITER
und DATE_FORMAT
erstellt wird und die options
-Methode mit diesem Dictionary aufgerufen wird.
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)
Szenario 2¶
Eingabecode
Nachfolgend sehen Sie ein Beispiel, in dem versucht wird, Daten im JSON
-Format zu speichern.
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")
Ausgabecode
Das Tool fügt diese EWI SPRKPY1083
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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")
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameReader-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die Methode
load
durch die Methode json oder copy_into_locationWenn Sie die
copy_into_location
- Methode verwenden, müssen Sie das Format mit dem Parameterfile_format_type
angeben.Der erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, in dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird eine der oben genannten Methoden aufgerufen.
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")
Korrigieren des
Modus
-Parameters:Verwenden Sie die mode-Funktion von Snowpark DataFrameWriter wie folgt:
Nachfolgend finden Sie ein Beispiel, das die Methode mode
mit overwrite
als ein Parameter in die Verkettung einfügt.
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")
Korrigieren des
partitionBy
-Parameters:Verwenden Sie den Parameter partition_by aus der
CSV
-Methode wie folgt:
Nachfolgend finden Sie ein Beispiel, das den partition_by
-Parameter aus der CSV
-Methode verwendet.
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")
Korrigieren des
options
-Parameters:Verwenden Sie den format_type_options-Parameter aus der
CSV
-Methode wie folgt:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall werden dateFormat
und timestampFormat
durch DATE_FORMAT
und TIMESTAMP_FORMAT
ersetzt, der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, bei dem ein Dictionary mit DATE_FORMAT
und TIMESTAMP_FORMAT
erstellt wird und die options
-Methode mit diesem Dictionary aufgerufen wird.
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)
Szenario 3¶
Eingabecode
Nachfolgend sehen Sie ein Beispiel, in dem versucht wird, Daten im PARQUET
-Format zu speichern.
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")
Ausgabecode
Das Tool fügt diese EWI SPRKPY1083
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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")
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameReader-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die Methode
load
durch die Methode parquet oder copy_into_location.Wenn Sie die
copy_into_location
- Methode verwenden, müssen Sie das Format mit dem Parameterfile_format_type
angeben.Der erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, in dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird eine der oben genannten Methoden aufgerufen.
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")
Korrigieren des
Modus
-Parameters:Verwenden Sie die mode-Funktion von Snowpark DataFrameWriter wie folgt:
Nachfolgend finden Sie ein Beispiel, das die Methode mode
mit overwrite
als ein Parameter in die Verkettung einfügt.
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")
Korrigieren des
partitionBy
-Parameters:Verwenden Sie den Parameter partition_by aus der
CSV
-Methode wie folgt:
Nachfolgend finden Sie ein Beispiel, das den Parameter partition_by
aus der Methode parquet
verwendet.
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")
Korrigieren des
options
-Parameters:Verwenden Sie den format_type_options-Parameter aus der
CSV
-Methode wie folgt:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall wird pathGlobFilter
durch PATTERN
ersetzt, der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, in dem ein Dictionary mit PATTERN
erstellt und die options
-Methode mit diesem Dictionary aufgerufen wird.
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)
Zusätzliche Empfehlungen¶
Beachten Sie, dass die Optionen zwischen Spark und Snowpark nicht die gleichen sind, aber sie können zugeordnet werden:
Spark-Optionen |
Möglicher Wert |
Snowpark-Äquivalent |
Beschreibung |
---|---|---|---|
Header |
„True“ oder „False“ |
SKIP_HEADER = 1 / SKIP_HEADER = 0 |
Um die erste Zeile einer Datei als Spaltennamen zu verwenden. |
Trennzeichen |
Beliebiges ein-/mehrstelliges Feldtrennzeichen |
FIELD_DELIMITER |
Um einzelne/mehrere Zeichen als Trennzeichen für jede Spalte/jedes Feld festzulegen. |
sep |
Ein beliebiges einstelliges Feldtrennzeichen |
FIELD_DELIMITER |
Um ein einzelnes Zeichen als Trennzeichen für jede Spalte/jedes Feld anzugeben. |
Codierung |
UTF-8, UTF-16 usw… |
ENCODING |
Zum Decodieren der CSV-Dateien nach dem angegebenen Codierungstyp. Die Standardcodierung ist UTF-8 |
lineSep |
Ein beliebiges einzelnes Zeilentrennzeichen |
RECORD_DELIMITER |
Um das Zeilentrennzeichen zu definieren, das für das Parsen von Dateien verwendet werden soll. |
pathGlobFilter |
Dateimuster |
PATTERN |
So definieren Sie ein Muster, um nur Dateien zu lesen, deren Dateinamen dem Muster entsprechen. |
recursiveFileLookup |
„True“ oder „False“ |
N/A |
Zum rekursiven Durchsuchen eines Verzeichnisses, um Dateien zu lesen. Der Standardwert für diese Option ist „False“. |
Anführungszeichen |
Einzelnes Zeichen, das in Anführungszeichen gesetzt werden soll |
FIELD_OPTIONALLY_ENCLOSED_BY |
Um Felder/Spalte, die Felder enthalten, in Anführungszeichen zu setzen, und das Trennzeichen dabei Teil des Wertes sein kann. Dieses Zeichen „To quote all fields“, wenn es mit quoteAll-Option verwendet wird. Der Standardwert dieser Option ist das doppelte Anführungszeichen(„). |
nullValue |
Zeichenfolge zum Ersetzen von „null“ |
NULL_IF |
Ersetzen von Nullwerten durch die Zeichenfolge beim Lesen und Schreiben von Datenframe. |
dateFormat |
Gültiges Datumsformat |
DATE_FORMAT |
Um eine Zeichenfolge zu definieren, die ein Datumsformat angibt. Das Standardformat ist jjjj-MM-tt. |
timestampFormat |
Gültiges Format des Zeitstempels |
TIMESTAMP_FORMAT |
Zur Definition einer Zeichenfolge, die ein Zeitstempelformat angibt. Das Standardformat ist jjjj-MM-tt ‚T’HH: mm:ss. |
Escape-Zeichen |
Jedes einzelne Zeichen |
ESCAPE |
So legen Sie ein einzelnes Zeichen als Escape-Zeichen fest, um das Standard-Escape-Zeichen (\) zu überschreiben. |
inferSchema |
„True“ oder „False“ |
INFER_SCHEMA |
Erkennt automatisch das Dateischema |
mergeSchema |
„True“ oder „False“ |
N/A |
Wird in Snowflake nicht benötigt, da dies immer dann geschieht, wenn das infer_schema die Parquet-Dateistruktur bestimmt |
Für die Option modifiedBefore/modifiedAfter können Sie das gleiche Ergebnis in Snowflake erzielen, indem Sie die Metadaten-Spalten verwenden und dann einen Filter hinzufügen wie z. B.:
df.filter(METADATA_FILE_LAST_MODIFIED > 'some_date')
.Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1044¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 2.4.0
Meldung: pyspark.sql.functions.split hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.split erkennt, für das es eine Problemumgehung gibt.
Szenarien¶
Es gibt mehrere Szenarien, die von der Anzahl der an die Methode übergebenen Parameter abhängen.
Szenario 1¶
Eingabe
Unten sehen Sie ein Beispiel, wenn die Funktion split
nur die str und pattern-Parameter hat
F.split('col', '\\|')
Ausgabe
Das Tool zeigt die EWI SPRKPY1044
an und weist darauf hin, dass es eine Problemumgehung gibt.
#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|')
Empfohlene Korrektur
Als Problemumgehung können Sie die snowflake.snowpark.functions.lit-Funktion mit dem Musterparameter aufrufen und in den „Split“ schicken.
F.split('col', lit('\\|'))
## the result of lit will be sent to the split function
Szenario 2¶
Eingabe
Nachfolgend ein weiteres Beispiel, wenn die Funktion split
die Parameter str, pattern und limit hat.
F.split('col', '\\|', 2)
Ausgabe
Das Tool zeigt die EWI SPRKPY1044
an und weist darauf hin, dass es eine Problemumgehung gibt.
#EWI: SPRKPY1044 => pyspark.sql.functions.split has a workaround, see the documentation for more info
F.split('col', '\\|', 2)
Empfohlene Korrektur
Dieses spezielle Szenario wird nicht unterstützt.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1015¶
Meldung: pyspark.sql.functions.atanh hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.atanh erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel berechnet pyspark den atanh für einen Datenframe mit pyspark.sql.functions.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"]))
Ausgabe
SMA gibt die EWI SPRKPY1015 über die Zeile zurück, in der atanh verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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"]))
Empfohlene Korrektur
Es gibt keine direkte „atanh“-Implementierung, aber“call_function“ kann stattdessen verwendet werden, wobei „atanh“ als erster Parameter und colName als zweiter Parameter verwendet wird.
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')))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1005¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldunge : pyspark.conf.SparkConf ist nicht erforderlich
Kategoriey : Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.conf.SparkConf erkennt, die nicht erforderlich ist.
Szenario¶
Eingabe
SparkConf kann ohne Parameter oder mit loadDefaults aufgerufen werden.
from pyspark import SparkConf
my_conf = SparkConf(loadDefaults=True)
Ausgabe
In beiden Fällen (mit oder ohne Parameter) erstellt SMA ein Snowpark Session.builder-Objekt:
#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()
Zusätzliche Empfehlungen¶
Hier wird ein unnötiger Parameter entfernt und ein Warnkommentar eingefügt. Der Benutzer muss nichts weiter tun.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1054¶
Meldung: pyspark.sql.readwriter.DataFrameReader.format wird nicht unterstützt.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn die Funktion pyspark.sql.readwriter.DataFrameReader.format ein Argument hat, das von Snowpark nicht unterstützt wird.
Szenarien¶
Es gibt einige Szenarien, die von der Art des Formats abhängen, das Sie zu laden versuchen. Es kann ein unterstütztes
oder nicht unterstütztes
Format sein.
Szenario 1¶
Eingabe
Das Tool analysiert den Typ des Formats, das Sie zu laden versuchen, die unterstützten Formate sind:
Csv
JSON
Parquet
Orc
Das folgende Beispiel zeigt, wie das Tool die format
-Methode transformiert, wenn ein Csv
-Wert übergeben wird.
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df1 = spark.read.format('csv').load('/path/to/file')
Ausgabe
Das Tool wandelt die format
-Methode in einen Aufruf der Csv
-Methode um.
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
df1 = spark.read.csv('/path/to/file')
Empfohlene Korrektur
In diesem Fall zeigt das Tool die EWI nicht an, d. h. es ist keine Korrektur erforderlich.
Szenario 2¶
Eingabe
Das folgende Beispiel zeigt, wie das Tool die format
-Methode umwandelt, wenn ein Jdbc
-Wert übergeben wird.
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()
Ausgabe
Das Tool zeigt die EWI SPRKPY1054
an, die besagt, dass der Wert „jdbc“ nicht unterstützt wird.
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()
Empfohlene Korrektur
Für die nicht unterstützten
Szenarien gibt es keine spezifische Korrektur, da es von den Dateien abhängt, die zu lesen versucht werden.
Szenario 3¶
Eingabe
Das folgende Beispiel zeigt, wie das Tool die format
-Methode umwandelt, wenn eine CSV
übergeben wird, aber stattdessen eine Variable verwendet wird.
from snowflake.snowpark import Session
spark = Session.builder.getOrCreate()
myFormat = 'csv'
df3 = spark.read.format(myFormat).load('/path/to/file')
Ausgabe
Da das Tool den Wert der Variable zur Laufzeit nicht ermitteln kann, zeigt es die EWI SPRKPY1054
an, die angibt, dass der Wert „“ nicht unterstützt wird.
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')
Empfohlene Korrektur
Als Problemumgehung können Sie den Wert der Variablen überprüfen und ihn als Zeichenfolge zum Aufruf von Format
hinzufügen.
Zusätzliche Empfehlungen¶
Der Snowpark-Speicherort akzeptiert nur Cloud-Speicherorte, die einen Snowflake-Stagingbereich verwenden.
Die Dokumentation der von Snowpark unterstützten Methoden finden Sie in der Dokumentation
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1060¶
Meldung: Der Authentifizierungsmechanismus ist connection.json (Vorlage vorhanden).
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.conf.SparkConf erkennt.
Szenario¶
Eingabe
Da der Authentifizierungsmechanismus in Snowpark anders ist, entfernt das Tool die Verwendungen und erstellt stattdessen eine Verbindungskonfigurationsdatei (connection.json).
from pyspark import SparkConf
my_conf = SparkConf(loadDefaults=True)
Ausgabe
Das Tool fügt die EWI SPRKPY1060
hinzu, die angibt, dass es sich um einen anderen Authentifizierungsmechanismus handelt.
#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
Empfohlene Korrektur
Um eine Verbindung zu erstellen, müssen Sie die Informationen in der connection.json
-Datei eingeben.
{
"user": "<USER>",
"password": "<PASSWORD>",
"account": "<ACCOUNT>",
"role": "<ROLE>",
"warehouse": "<WAREHOUSE>",
"database": "<DATABASE>",
"schema": "<SCHEMA>"
}
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1031¶
Warnung
Dieser Problemcode gilt als veraltet seit Spark Conversion Core 2.7.0
Meldung: pyspark.sql.column.Column.contains hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.column.Column.contains-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.column.Column.contains
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die Funktion contains
verwendet, um die Zeilen zu filtern, in denen die Spalte „Stadt“ die Teilzeichenkette „Neu“ enthält.
df = spark.createDataFrame([("Alice", "New York"), ("Bob", "Los Angeles"), ("Charlie", "Chicago")], ["Name", "City"])
df_filtered = df.filter(col("City").contains("New"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1031
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie die snowflake.snowpark.functions.contains-Funktion verwenden, indem Sie die Spalte als erstes Argument und das zu suchende Element als zweites Argument übergeben. Wenn es sich bei dem zu suchenden Element um einen Literalwert handelt, sollte dieser mit der Funktion lit
in einen Spaltenausdruck umgewandelt werden.
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")))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1020¶
Meldung: pyspark.sql.functions.instr hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.instr erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Hier ist ein einfaches Beispiel für die Verwendung von 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()
Ausgabe:
SMA gibt die EWI SPRKPY1020 über die Zeile zurück, in der instr verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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()
Empfohlene Korrektur
Erfordert eine manuelle Änderung, indem Sie die Funktion charindex verwenden und die Reihenfolge der ersten beiden Parameter ändern.
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()
Zusätzliche Empfehlung¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1071¶
Meldung: Die Funktion pyspark.rdd.RDD.getNumPartitions ist in Snowpark nicht erforderlich. Sie sollten also alle Referenzen entfernen.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung der pyspark.rdd.RDD.getNumPartitions-Funktion findet. Snowflake verwendet einen Mechanismus zur Mikropartitionierung, so dass die Verwendung dieser Funktion nicht erforderlich ist.
Szenario¶
Eingabe
Die getNumPartitions gibt die Anzahl der Partitionen auf einer RDD zurück.
df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
print(df.getNumPartitions())
Ausgabe
Das Tool fügt diese EWI hinzu, um Sie darauf hinzuweisen, dass getNumPartitions nicht erforderlich ist.
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())
Empfohlene Korrektur
Entfernen Sie alle Verwendungen dieser Funktion.
df = spark.createDataFrame([('2015-04-08',), ('5',), [Row(a=1, b="b")]], ['dt', 'num', 'row'])
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.`
SPRKPY1082¶
Meldung: Die pyspark.sql.readwriter.DataFrameReader.load-Funktion wird nicht unterstützt. Eine Problemumgehung besteht darin, stattdessen die formatabhängige Snowpark DataFrameReader-Methode zu verwenden (avro csv, json, orc, parquet). Der Pfadparameter sollte ein Stagingbereich sein.
Kategorie: Warnung
Beschreibung¶
Die Funktion pyspark.sql.readwriter.DataFrameReader.load wird nicht unterstützt. Die Problemumgehung besteht darin, stattdessen die Snowpark DataFrameReader-Methoden zu verwenden.
Szenarien¶
Die Spark-Signatur für diese Methode DataFrameReader.load(path, format, schema, **options)
existiert nicht in Snowpark. Daher wird jede Verwendung der Ladefunktion zu einer EWI im Ausgabecode führen.
Szenario 1¶
Eingabe
Nachfolgend sehen Sie ein Beispiel, das versucht, Daten aus einer CSV
-Quelle zu laden.
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()
Ausgabe
Die SMA fügt die EWI SPRKPY1082
hinzu, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameReader-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die Methode
load
durch die Methodecsv
.Der erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, bei dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird die CSV
-Methode aufgerufen.
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()
Korrigieren des
Schema
-Parameters:Das Schema kann mit der Funktion schema wie folgt festgelegt werden:
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).csv(temp_stage)
Korrigieren des
options
-Parameters:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall werden lineSep
und dateFormat
durch RECORD_DELIMITER
und DATE_FORMAT
ersetzt, der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, bei dem ein Dictionary mit RECORD_DELIMITER
und DATE_FORMAT
erstellt wird und die options
-Methode mit diesem Dictionary aufgerufen wird.
optionsParam = {"RECORD_DELIMITER": "\r\n", "DATE_FORMAT": "YYYY/MM/DD"}
df = my_session.read.options(optionsParam).csv(stage)
Szenario 2¶
Eingabe
Nachfolgend sehen Sie ein Beispiel, das versucht, Daten aus einer JSON
-Quelle zu laden.
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()
Ausgabe
Die SMA fügt die EWI SPRKPY1082
hinzu, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameReader-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die Methode
load
durch diejson
-MethodeDer erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, bei dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird die JSON
-Methode aufgerufen.
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()
Korrigieren des
Schema
-Parameters:Das Schema kann mit der Funktion schema wie folgt festgelegt werden:
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).json(temp_stage)
Korrigieren des
options
-Parameters:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall werden dateFormat
und timestampFormat
durch DATE_FORMAT
und TIMESTAMP_FORMAT
ersetzt, der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, bei dem ein Dictionary mit DATE_FORMAT
und TIMESTAMP_FORMAT
erstellt wird und die options
-Methode mit diesem Dictionary aufgerufen wird.
optionsParam = {"DATE_FORMAT": "YYYY/MM/DD", "TIMESTAMP_FORMAT": "YYYY-MM-DD HH24:MI:SS.FF3"}
df = Session.read.options(optionsParam).json(stage)
Szenario 3¶
Eingabe
Nachfolgend sehen Sie ein Beispiel, das versucht, Daten aus einer PARQUET
-Quelle zu laden.
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()
Ausgabe
Die SMA fügt die EWI SPRKPY1082
hinzu, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird, aber es eine Problemumgehung gibt.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie stattdessen die Snowpark DataFrameReader-Methoden verwenden.
Korrigieren der Parameter
path
undformat
:Ersetzen Sie die
load
-Methode durch dieparquet
-MethodeDer erste
Pfad
-Parameter muss sich in einem Stagingbereich befinden, um eine Entsprechung mit Snowpark zu haben.
Nachfolgend finden Sie ein Beispiel, bei dem ein zeitlicher Stagingbereich erstellt und die Datei darin abgelegt wird. Anschließend wird die PARQUET
-Methode aufgerufen.
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()
Korrigieren des
Schema
-Parameters:Das Schema kann mit der Funktion schema wie folgt festgelegt werden:
schemaParam = StructType([
StructField("name", StringType(), True),
StructField("city", StringType(), True)
])
df = my_session.read.schema(schemaParam).parquet(temp_stage)
Korrigieren des
options
-Parameters:
Die Optionen zwischen Spark und Snowpark sind nicht die gleichen, in diesem Fall wird pathGlobFilter
durch PATTERN
ersetzt. Der Abschnitt Zusätzliche Empfehlungen enthält eine Tabelle mit allen Äquivalenzen.
Nachfolgend finden Sie ein Beispiel, in dem ein Dictionary mit PATTERN
erstellt und die options
-Methode mit diesem Dictionary aufgerufen wird.
optionsParam = {"PATTERN": "*.parquet"}
df = Session.read.options(optionsParam).parquet(stage)
Zusätzliche Empfehlungen¶
Berücksichtigen Sie, dass die Optionen zwischen Spark und Snowpark nicht die gleichen sind, aber sie können zugeordnet werden:
Spark-Optionen |
Möglicher Wert |
Snowpark-Äquivalent |
Beschreibung |
---|---|---|---|
Header |
„True“ oder „False“ |
SKIP_HEADER = 1 / SKIP_HEADER = 0 |
Um die erste Zeile einer Datei als Spaltennamen zu verwenden. |
Trennzeichen |
Beliebiges ein-/mehrstelliges Feldtrennzeichen |
FIELD_DELIMITER |
Um einzelne/mehrere Zeichen als Trennzeichen für jede Spalte/jedes Feld festzulegen. |
sep |
Ein beliebiges einstelliges Feldtrennzeichen |
FIELD_DELIMITER |
Um ein einzelnes Zeichen als Trennzeichen für jede Spalte/jedes Feld anzugeben. |
Codierung |
UTF-8, UTF-16 usw… |
ENCODING |
Zum Decodieren der CSV-Dateien nach dem angegebenen Codierungstyp. Die Standardcodierung ist UTF-8 |
lineSep |
Ein beliebiges einzelnes Zeilentrennzeichen |
RECORD_DELIMITER |
Um das Zeilentrennzeichen zu definieren, das für das Parsen von Dateien verwendet werden soll. |
pathGlobFilter |
Dateimuster |
PATTERN |
So definieren Sie ein Muster, um nur Dateien zu lesen, deren Dateinamen dem Muster entsprechen. |
recursiveFileLookup |
„True“ oder „False“ |
N/A |
Zum rekursiven Durchsuchen eines Verzeichnisses, um Dateien zu lesen. Der Standardwert für diese Option ist „False“. |
Anführungszeichen |
Einzelnes Zeichen, das in Anführungszeichen gesetzt werden soll |
FIELD_OPTIONALLY_ENCLOSED_BY |
Um Felder/Spalte, die Felder enthalten, in Anführungszeichen zu setzen, und das Trennzeichen dabei Teil des Wertes sein kann. Dieses Zeichen „To quote all fields“, wenn es mit quoteAll-Option verwendet wird. Der Standardwert dieser Option ist das doppelte Anführungszeichen(„). |
nullValue |
Zeichenfolge zum Ersetzen von „null“ |
NULL_IF |
Ersetzen von Nullwerten durch die Zeichenfolge beim Lesen und Schreiben von Datenframe. |
dateFormat |
Gültiges Datumsformat |
DATE_FORMAT |
Um eine Zeichenfolge zu definieren, die ein Datumsformat angibt. Das Standardformat ist jjjj-MM-tt. |
timestampFormat |
Gültiges Format des Zeitstempels |
TIMESTAMP_FORMAT |
Zur Definition einer Zeichenfolge, die ein Zeitstempelformat angibt. Das Standardformat ist jjjj-MM-tt ‚T’HH: mm:ss. |
Escape-Zeichen |
Jedes einzelne Zeichen |
ESCAPE |
So legen Sie ein einzelnes Zeichen als Escape-Zeichen fest, um das Standard-Escape-Zeichen (\) zu überschreiben. |
inferSchema |
„True“ oder „False“ |
INFER_SCHEMA |
Erkennt automatisch das Dateischema |
mergeSchema |
„True“ oder „False“ |
N/A |
Wird in Snowflake nicht benötigt, da dies immer dann geschieht, wenn das infer_schema die Parquet-Dateistruktur bestimmt |
Für die Option modifiedBefore/modifiedAfter können Sie das gleiche Ergebnis in Snowflake erzielen, indem Sie die Metadaten-Spalten verwenden und dann einen Filter hinzufügen wie:
df.filter(METADATA_FILE_LAST_MODIFIED > 'some_date')
.Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1045¶
Meldung: pyspark.sql.functions.map_values hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Diese Funktion wird verwendet, um die Liste der Werte aus einer Spalte zu extrahieren, die eine map/dictionary (keys/values) enthält.
Das Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.map_values erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der map_values
-Methode.
df = spark.createDataFrame(
[(1, {'Apple': 'Fruit', 'Potato': 'Vegetable'})],
("id", "a_map"))
df.select(map_values("a_map")).show()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1045
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie eine udf erstellen, um die Werte für eine Spalte zu erhalten. Das folgende Beispiel zeigt, wie Sie die udf erstellen, sie dann F.map_values
zuweisen und sie anschließend verwenden können.
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))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1014¶
Meldung: pyspark.sql.functions.asinh hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.asinh erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel berechnet pyspark das asinh für einen Datenframe mit pyspark.sql.functions.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"]))
Ausgabe
SMA gibt die EWI SPRKPY1014 über die Zeile zurück, in der asinh verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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"]))
Empfohlene Korrektur
Es gibt keine direkte „asinh“-Implementierung, aber „call_function“ kann stattdessen verwendet werden, wobei „asinh“ als erster Parameter und colName als zweiter Parameter verwendet wird.
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')))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1004¶
Meldunge : Die Symboltabelle konnte nicht geladen werden.
Kategoriey : Parsing-Fehler.
Beschreibung¶
Dieses Problem tritt auf, wenn ein unerwarteter Fehler bei der Ausführung des Tools auftritt. Da die Symboltabelle nicht geladen werden kann, kann das Tool den Bewertungs- oder Konvertierungsprozess nicht starten.
Zusätzliche Empfehlungen ¶
Es ist unwahrscheinlich, dass dies ein Fehler im Quellcode selbst ist, sondern eher ein Fehler in der Art und Weise, wie das Tool den Quellcode verarbeitet. Am besten wenden Sie sich an das SMA-Support-Team. Sie können uns eine E-Mail an sma-support@snowflake.com senden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem in der SMA melden.
SPRKPY1055¶
Meldung: pyspark.sql.readwriter.DataFrameReader.option key value wird nicht unterstützt.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn die pyspark.sql.readwriter.DataFrameReader.option
key value nicht von SnowFlake unterstützt wird.
Das Tool analysiert die Parameter des Optionsaufrufs, und je nach Methode (CSV oder JSON oder PARQUET) kann der Schlüsselwert eine Äquivalenz in Snowpark haben oder nicht. Wenn alle Parameter eine Äquivalenz haben, fügt das Tool die EWI nicht hinzu und ersetzt den Schlüsselwert durch sein Äquivalentes, andernfalls fügt das Tool die EWI hinzu.
Liste der Äquivalenzen:
Äquivalenzen für CSV:
Spark-Optionstasten |
Snowpark-Äquivalenzen |
---|---|
sep |
FIELD_DELIMITER |
Header |
PARSE_HEADER |
lineSep |
RECORD_DELIMITER |
pathGlobFilter |
PATTERN |
Anführungszeichen |
FIELD_OPTIONALLY_ENCLOSED_BY |
nullValue |
NULL_IF |
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
inferSchema |
INFER_SCHEMA |
Trennzeichen |
FIELD_DELIMITER |
Äquivalenzen für JSON:
Spark-Optionstasten |
Snowpark-Äquivalenzen |
---|---|
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
pathGlobFilter |
PATTERN |
Äquivalenzen für PARQUET:
Spark-Optionstasten |
Snowpark-Äquivalenzen |
---|---|
pathGlobFilter |
PATTERN |
Alle anderen Schlüsseloptionen, die nicht in einer der oben genannten Tabellen enthalten sind, werden nicht unterstützt oder haben keine Äquivalenten in Snowpark. Wenn das der Fall ist, fügt das Tool die EWI mit den Parameterinformationen hinzu und entfernt sie aus der Kette.
Szenarien¶
Die folgenden Szenarien gelten für CSV, JSON und PARQUET.
Es gibt einige Szenarien, die vom Wert des Schlüssels abhängen, der in der Methode option
verwendet wird.
Szenario 1¶
Eingabe
Nachfolgend finden Sie ein Beispiel für einen Aufruf der Option `` unter Verwendung eines äquivalenten Schlüssels
.
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)
Ausgabe
Das Tool wandelt den Schlüssel in das richtige Äquivalent um.
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)
Empfohlene Korrektur
Da das Tool den Wert des Schlüssels umwandelt, ist eine Korrektur nicht erforderlich.
Szenario 2¶
Eingabe
Nachfolgend finden Sie ein Beispiel für einen Aufruf der Option `` unter Verwendung eines nicht-äquivalenten Schlüssels
.
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)
Ausgabe
Das Tool fügt den EWI SPRKPY1055
hinzu, der angibt, dass der Schlüssel nicht unterstützt wird, und entfernt den Aufruf der Option ``.
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)
Empfohlene Korrektur
Es wird empfohlen, die Verhaltensweise nach der Umwandlung zu überprüfen.
Zusätzliche Empfehlungen¶
Wenn nicht-äquivalente Parameter vorhanden sind, empfiehlt es sich, die Verhaltensweise nach der Umwandlung zu überprüfen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1061¶
Meldung: Snowpark unterstützt keine unix_timestamp-Funktionen
Kategorie: Warnung
Beschreibung¶
In Snowpark ist der erste Parameter obligatorisch. Das Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.unix_timestamp ohne Parameter erkennt.
Szenario¶
Eingabe
Nachfolgend ein Beispiel, das die unix_timestamp
-Methode ohne Parameter aufruft.
data = [["2015-04-08", "10"],["2015-04-10", "15"]]
df = spark.createDataFrame(data, ['dt', 'val'])
df.select(unix_timestamp()).show()
Ausgabe
Die Snowpark-Signatur für diese Funktion unix_timestamp(e: ColumnOrName, fmt: Optional["Column"] = None)
, wie Sie sehen können, ist der erste Parameter erforderlich.
Das Tool fügt diese EWI SPRKPY1061
hinzu, um Sie darüber zu informieren, dass in Snowpark die unix_timestamp-Funktion ohne Parameter nicht unterstützt wird.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie zumindest den Namen oder die Spalte der Zeitstempelzeichenfolge hinzufügen.
data = [["2015-04-08", "10"],["2015-04-10", "15"]]
df = spark.createDataFrame(data, ["dt", "val"])
df.select(unix_timestamp("dt")).show()
Zusätzliche Empfehlungen¶
Sie können auch den current_timestamp() als ersten Parameter hinzufügen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1030¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.session.SparkSession.Builder.appName hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.session.SparkSession.Builder.appName-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.session.SparkSession. Builder.appName
, die diese EWI erzeugt. In diesem Beispiel wird die Funktion appName
verwendet, um MyApp als Namen für die Anwendung festzulegen.
session = SparkSession.builder.appName("MyApp").getOrCreate()
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1030
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
#EWI: SPRKPY1030 => pyspark.sql.session.SparkSession.Builder.appName has a workaround, see documentation for more info
session = Session.builder.appName("MyApp").getOrCreate()
Empfohlene Korrektur
Als Problemumgehung können Sie das Paket snowpark_extensions importieren, das eine Erweiterung für die appName
-Funktion bietet.
import snowpark_extensions
session = SessionBuilder.appName("MyApp").getOrCreate()
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1010¶
Meldung: pyspark.sql.dataframe.DataFrame.checkpoint hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.dataframe.DataFrame.checkpoint erkennt, das eine Problemumgehung bietet.
Szenario¶
Eingabe
In PySpark werden Checkpoints dazu verwendet, den logischen Plan eines Datenframes abzuschneiden, um das Anwachsen eines logischen Plans zu vermeiden.
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)
Ausgabe
SMA gibt die EWI SPRKPY1010 über die Zeile zurück, in der approxQuantile verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen. Beachten Sie, dass auch das setCheckpointDir als nicht unterstützt, aber ein gechecktes Verzeichnis ist für die Korrektur nicht erforderlich.
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)
Empfohlene Korrektur
Snowpark macht explizite Checkpoints überflüssig: Dies liegt daran, dass Snowpark mit SQL-basierten Operationen arbeitet, die von der Snowflake Abfrageoptimierungs-Engine optimiert werden, so dass keine unerfüllten Berechnungen oder außer Kontrolle geratene logische Pläne erforderlich sind.
Es kann jedoch Szenarien geben, in denen Sie das Ergebnis einer Berechnung in einem Datenframe beibehalten möchten. In diesen Szenarien können Sie die Ergebnisse speichern, indem Sie den Datenframe in eine Snowflake-Tabelle oder in eine temporäre Snowflake-Tabelle schreiben.
Durch die Verwendung einer permanenten Tabelle oder des berechneten Ergebnisses kann jederzeit, auch nach dem Ende der Sitzung, darauf zugegriffen werden.
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"
Eine alternative Lösung, die Verwendung einer temporären Tabelle, hat den Vorteil, dass die Tabelle nach Beendigung der Sitzung gelöscht wird:
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"
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1101¶
Kategorie¶
Parsing-Fehler.
Beschreibung¶
Wenn das Tool einen Parsing-Fehler erkennt, versucht es, ihn zu beheben und setzt den Prozess in der nächsten Zeile fort. In diesen Fällen werden der Fehler und die Kommentare in der Zeile angezeigt.
Dieses Beispiel zeigt, wie ein Fehler bei der Abweichung zwischen Leerzeichen und Tabulatoren behandelt wird.
Eingabecode
def foo():
x = 5 # Spaces
y = 6 # Tab
def foo2():
x=6
y=7
Ausgabecode
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
Empfehlungen¶
Versuchen Sie, die kommentierte Zeile zu korrigieren.
Wenn Sie weitere Unterstützung benötigen, schicken Sie uns eine E-Mail an sma-support@snowflake.com. Wenn Sie einen Supportvertrag mit Snowflake abgeschlossen haben, wenden Sie sich an Ihren Vertriebsingenieur, der Ihre Supportanfragen bearbeiten kann.
SPRKPY1041¶
Warnung
Dieser Problemcode gilt als veraltet seit Spark Conversion Core Version 2.9.0
Meldung: pyspark.sql.functions.explode_outer hat eine Problemumgehung
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.explode_outer erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Das Beispiel zeigt die Verwendung der explode_outer-Methode in einem Auswahl-Aufruf.
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()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1041
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie das Paket snowpark_extensions importieren, das eine Hilfestellung für die explode_outer
-Funktion enthält.
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()
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1075¶
Kategorie
Warnung.
Beschreibung¶
Parse_json wendet keine Schema-Validierung an. Wenn Sie auf der Grundlage eines Schemas filtern/validieren möchten, müssen Sie möglicherweise eine Logik einführen.
Beispiel¶
Eingabe
df.select(from_json(df.value, Schema))
df.select(from_json(schema=Schema, col=df.value))
df.select(from_json(df.value, Schema, option))
Ausgabe
#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))
Bei der Funktion from_json wird das Schema nicht wirklich zur Inferenz übergeben, sondern zur Validierung verwendet. Siehe diese Beispiele:
data = [
('{"name": "John", "age": 30, "city": "New York"}',),
('{"name": "Jane", "age": "25", "city": "San Francisco"}',)
]
df = spark.createDataFrame(data, ["json_str"])
Beispiel 1: Datentypen erzwingen und Spaltennamen ändern:
## 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
Beispiel 2: Bestimmte Spalten auswählen:
## 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
Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden. Wenn Sie einen Supportvertrag mit Snowflake abgeschlossen haben, wenden Sie sich an Ihren Vertriebsingenieur, der Ihren Supportbedarf ermitteln kann.
Nützliche Tools PEP-8 und Neu-Einrückung.
SPRKPY1024¶
Meldung: pyspark.sql.functions.log2 hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der Funktion pyspark.sql.functions.log2 erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.log2
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die log2
-Funktion verwendet, um den Logarithmus zur Basis 2 des Wertes der Spalte **** zu berechnen.
df = spark.createDataFrame([(1,), (2,), (4,), (8,), (16,)], ["value"])
df_with_log2 = df.withColumn("log2_value", log2(df["value"]))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1024
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"]))
Empfohlene Korrektur
Als Problemumgehung können Sie die snowflake.snowpark.functions.log-Funktion verwenden, indem Sie als Basis den Literalwert 2
übergeben.
df = session.createDataFrame([(1,), (2,), (4,), (8,), (16,)], ["value"])
df_with_log2 = df.withColumn("log2_value", log(2, df["value"]))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1086¶
Meldung: pyspark.ml.linalg.VectorUDT wird nicht unterstützt.
Kategorie: Warnung
Beschreibung¶
Die Datei pyspark.ml.linalg.VectorUDT wird nicht unterstützt.
Szenario¶
Eingabecode
VectorUDT ist ein Datentyp zur Darstellung von Vektorspalten in einem 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)
Ausgabecode
Das Tool fügt diese EWI SPRKPY1086
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird.
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)
Empfohlene Korrektur
Für die pyspark.ml.linalg.VectorUDT gibt es keine empfohlene Lösung.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1034¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.desc hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der pyspark.sql.functions.desc-Funktion feststellt, für die es eine Problemumgehung gibt.
Szenarien¶
Die pyspark.sql.functions.desc
-Funktion nimmt entweder ein Spaltenobjekt oder den Namen der Spalte als Zeichenfolge als Parameter entgegen. Beide Szenarien werden von Snowpark nicht unterstützt, daher wird diese EWI generiert.
Szenario 1¶
Eingabe
Nachfolgend sehen Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.functions.desc
, die ein Spaltenobjekt als Parameter annimmt.
df.orderBy(desc(col))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1034
hinzu, um Sie darauf hinzuweisen, dass die desc
-Funktion mit einem Spaltenobjekt-Parameter nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc(col))
Empfohlene Korrektur
Als Problemumgehung können Sie die snowflake.snowpark.Column.desc-Funktion über den Spaltenparameter aufrufen.
df.orderBy(col.desc())
Szenario 2¶
Eingabe
Nachfolgend sehen Sie ein Beispiel für die Verwendung der pyspark.sql.functions.desc
-Funktion, die den Namen der Spalte als Parameter erhält.
df.orderBy(desc("colName"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1034
hinzu, um Sie darauf hinzuweisen, dass die Funktion desc
mit einem Spaltennamen-Parameter nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
#EWI: SPRKPY1034 => pyspark.sql.functions.desc has a workaround, see documentation for more info
df.orderBy(desc("colName"))
Empfohlene Korrektur
Als Problemumgehung können Sie den String-Parameter mit der snowflake.snowpark.functions.col-Funktion in ein Spaltenobjekt umwandeln und dann die snowflake.snowpark.Column.desc-Funktion aufrufen.
df.orderBy(col("colName").desc())
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1065¶
Meldung: Der pyspark.context.SparkContext.broadcast trifft nicht zu, da Snowflake einen Mechanismus für das Clustering von Daten verwendet, um die Daten zu berechnen.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung des Elements pyspark.context.SparkContext.broadcast erkennt, was aufgrund der Verwendung des Data Clustering von Snowflake nicht notwendig ist.
Eingabecode
In diesem Beispiel wird eine Broadcast-Variable erstellt. Diese Variablen ermöglichen eine effizientere gemeinsame Nutzung von Daten durch alle Knotenpunkte.
sc = SparkContext(conf=conf_spark)
mapping = {1: 10001, 2: 10002}
bc = sc.broadcast(mapping)
Ausgabecode
Die SMA fügt eine EWI-Meldung hinzu, die besagt, dass die Übertragung nicht erforderlich ist.
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)
Empfohlene Korrektur
Entfernen Sie alle Verwendungen von pyspark.context.SparkContext.broadcast.
sc = conf_spark
mapping = {1: 10001, 2: 10002}
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1051¶
Warnung
Dieser Problemcode gilt als veraltet seit Spark Conversion Core Version 2.4.0
Meldung: pyspark.sql.session.SparkSession.Builder.master hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.session.SparkSession.Builder.master erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der Methode builder.master
, um den Spark-Master URL so einzustellen, dass er eine lokale Verbindung mit 1-Kern herstellt.
spark = SparkSession.builder.master("local[1]")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1051
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
#EWI: SPRKPY1051 => pyspark.sql.session.SparkSession.Builder.master has a workaround, see documentation for more info
spark = Session.builder.master("local[1]")
Empfohlene Korrektur
pyspark.sql.session.SparkSession.Builder.master
wird verwendet, um einen Spark-Cluster einzurichten. Snowpark verwendet keine Spark-Cluster, so dass Sie den Code entfernen oder kommentieren können.
## spark = Session.builder.master("local[1]")
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1000¶
Meldung: Die Spark-Core-Version des Quellprojekts ist xx.xx:xx.x.x, die von Snowpark unterstützte Spark-Core-Version ist 2.12:3.1.2, so dass es funktionale Unterschiede zwischen den vorhandenen Zuordnungen geben kann.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn die Pyspark-Version Ihres Quellcodes nicht unterstützt wird. Das bedeutet, dass es funktionale Unterschiede zwischen den bestehenden Zuordnungen geben kann.
Zusätzliche Empfehlungen¶
Die pyspark-Version, die von SMA auf Kompatibilität mit Snowpark geprüft wird, reicht von 2.12 bis 3.1.2. Wenn Sie eine Version außerhalb dieses Bereichs verwenden, kann das Tool inkonsistente Ergebnisse liefern. Sie können die Version des Quellcodes, den Sie scannen, ändern.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem in der SMA melden.
SPRKPY1081¶
Dieser Problemcode gilt als veraltet bereits seit Spark Conversion Core 4.12.0
Meldung: pyspark.sql.readwriter.DataFrameWriter.partitionBy hat eine Problemumgehung.
Kategorie: Warnung
Beschreibung¶
Die Funktion Pyspark.sql.readwriter.DataFrameWriter.partitionBy wird nicht unterstützt. Die Problemumgehung besteht darin, stattdessen copy_into_location von Snowpark zu verwenden. Weitere Informationen finden Sie in der Dokumentation.
Szenario¶
Eingabe
Dieser Code erstellt ein separates Verzeichnis für jeden eindeutigen Wert in der Spalte FIRST_NAME
. Die Daten sind dieselben, aber sie werden in verschiedenen Verzeichnissen gespeichert, je nach Spalte.
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.partitionBy("FIRST_NAME").csv("/home/data")
Dieser Code erstellt ein separates Verzeichnis für jeden eindeutigen Wert in der Spalte FIRST_NAME
. Die Daten sind dieselben, aber sie werden in verschiedenen Verzeichnissen gespeichert, je nach Spalte.
Ausgabecode
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"))
Empfohlene Korrektur
In Snowpark verfügt copy_into_location über einen Parameter partition_by, den Sie anstelle der partitionBy-Funktion verwenden können. Dazu sind jedoch einige manuelle Anpassungen erforderlich, wie das folgende Beispiel zeigt:
Spark-Code:
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.partitionBy("FIRST_NAME").csv("/home/data")
Snowpark-Code manuell angepasst:
df = session.createDataFrame([["John", "Berry"], ["Rick", "Berry"], ["Anthony", "Davis"]], schema = ["FIRST_NAME", "LAST_NAME"])
df.write.copy_into_location(location=temp_stage, partition_by=col("FIRST_NAME"), file_format_type="csv", format_type_options={"COMPRESSION": "NONE"}, header=True)
copy_into_location hat die folgenden Parameter
location: Der Snowpark-Standort akzeptiert nur Cloud-Speicherorte, die einen Snowflake-Stagingbereich verwenden.
partition_by: Es kann ein Spaltenname oder ein SQL-Ausdruck sein. Sie müssen also in eine Spalte oder SQL konvertieren, indem Sie col oder sql_expr verwenden.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1072¶
Meldung: Die Verwendung von StorageLevel ist in Snowpark nicht erforderlich.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung der StorageLevel-Klasse findet, die wie „Flags“ funktioniert, um die Speicherebene festzulegen. Da Snowflake die Speicherung steuert, ist die Verwendung dieser Funktion nicht erforderlich.
Zusätzliche Empfehlungen¶
Entfernen Sie alle Verwendungen dieser Funktion.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1023¶
Meldung: pyspark.sql.functions.log1p hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.sql.functions.log1p feststellt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.log1p
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die log1p
-Funktion verwendet, um den natürlichen Logarithmus des Wertes der Spalte **** zu berechnen.
df = spark.createDataFrame([(0,), (1,), (10,), (100,)], ["value"])
df_with_log1p = df.withColumn("log1p_value", log1p(df["value"]))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1023
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"]))
Empfohlene Korrektur
Als Problemumgehung können Sie die call_function-Funktion verwenden, indem Sie die Zeichenfolge ln
als erstes Argument übergeben und 1
zum zweiten Argument hinzufügen.
df = spark.createDataFrame([(0,), (1,), (10,), (100,)], ["value"])
df_with_log1p = df.withColumn("log1p_value", call_function("ln", lit(1) + df["value"]))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1017¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
pyspark.sql.functions.date_add bietet eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.date_add erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel verwenden wir date_add, um das Datum 5 Tage nach dem aktuellen Datum für den Datenframe df zu berechnen.
col = df.select(date_add(df.colName, 5))
Ausgabe
SMA gibt die EWI SPRKPY1017 über die Zeile zurück, in der date_add verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
#EWI: SPRKPY1017 => pyspark.sql.functions.date_add has a workaround, see documentation for more info
col = df.select(date_add(df.colName, 5))
Empfohlene Korrektur
Importieren Sie snowflake.snowpark.functions, die eine Implementierung für die Funktion date_add (und alias dateAdd) enthält.
from snowflake.snowpark.functions import date_add
col = df.select(date_add(df.dt, 1))
Zusätzliche Empfehlung¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1046¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 2.1.22
Meldung: pyspark.sql.functions.monotonically_increasing_id hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.monotonically_increasing_id erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der monotonically_increasing_id
-Methode.
from pyspark.sql import functions as F
spark.range(0, 10, 1, 2).select(F.monotonically_increasing_id()).show()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1046
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Aktualisieren Sie die Toolversion.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1056¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.readwriter.DataFrameReader.option argument _ <argument_name> _ ist kein Literal und kann nicht ausgewertet werden
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn der Schlüssel oder der Wert des Arguments der Funktion pyspark.sql.readwriter.DataFrameReader.option kein Literalwert ist (zum Beispiel eine Variable). Die SMA führt eine statische Analyse Ihres Quellcodes durch und kann daher den Inhalt des Arguments nicht bewerten.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.readwriter.DataFrameReader. option
, die diese EWI erzeugt.
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')
Ausgabe
Die SMA fügt dem Ausgabecode das EWI SPRKPY1056
hinzu, um Sie darauf hinzuweisen, dass das Argument dieser Funktion kein Literalwert ist und daher nicht von der SMA ausgewertet werden konnte.
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')
Empfohlene Korrektur
Auch wenn SMA das Argument nicht bewerten konnte, bedeutet das nicht, dass es von Snowpark nicht unterstützt wird. Bitte vergewissern Sie sich, dass der Wert des Arguments in Snowpark gültig und äquivalent ist, indem Sie in der -Dokumentation nachsehen.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1007¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldunge : pyspark.sql.context.SQLContext ist nicht erforderlich
Kategoriey : Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.context.SQLContext erkennt, die nicht erforderlich ist.
Szenario¶
Eingabe
Hier haben wir ein Beispiel mit verschiedenen SparkContext-Überlastungen.
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()
Ausgabe
Der Ausgabecode hat die Zeile für pyspark.SQLContext auskommentiert und ersetzt die Szenarien durch eine Referenz auf eine Konfiguration. Beachten Sie, dass die Variablen my_sc1 und my_sc2, die Spark-Eigenschaften enthalten, möglicherweise nicht benötigt werden oder angepasst werden müssen, um den Code zu korrigieren.
#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
Zusätzliche Empfehlungen¶
Dies ist ein unnötiger Parameter und wird mit einem Warnkommentar im Quellcode entfernt. Der Benutzer muss nichts unternehmen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1033¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.asc hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der pyspark.sql.functions.asc-Funktion feststellt, für die es eine Problemumgehung gibt.
Szenarien¶
Die Funktion pyspark.sql.functions.asc
nimmt entweder ein Spaltenobjekt oder den Namen der Spalte als Zeichenfolge als ihren Parameter entgegen. Beide Szenarien werden von Snowpark nicht unterstützt, daher wird diese EWI generiert.
Szenario 1¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.asc
-Funktion, die ein Spaltenobjekt als Parameter annimmt.
df.orderBy(asc(col))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1033
hinzu, um Sie darauf hinzuweisen, dass die asc
-Funktion mit einem Spaltenobjekt-Parameter nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc(col))
Empfohlene Korrektur
Als Problemumgehung können Sie die Funktion snowflake.snowpark.Column.asc über den Spaltenparameter aufrufen.
df.orderBy(col.asc())
Szenario 2¶
Eingabe
Nachfolgend sehen Sie ein Beispiel für die Verwendung der pyspark.sql.functions.asc
-Funktion, die den Namen der Spalte als Parameter erhält.
df.orderBy(asc("colName"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1033
hinzu, um Sie darauf hinzuweisen, dass die Funktion asc
mit einem Spaltennamen-Parameter nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
#EWI: SPRKPY1033 => pyspark.sql.functions.asc has a workaround, see documentation for more info
df.orderBy(asc("colName"))
Empfohlene Korrektur
Als Problemumgehung können Sie den Zeichenfolgenparameter mit der Funktion snowflake.snowpark.functions.col in ein Spaltenobjekt umwandeln und dann die Funktion snowflake.snowpark.Column.asc aufrufen.
df.orderBy(col("colName").asc())
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1062¶
Meldung: Snowpark unterstützt GroupedData.pivot nicht ohne den Parameter „values“.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.sql.group.GroupedData.pivot ohne den „values“-Parameter (the list of values to pivot on) erkennt.
Im Moment erfordert die Snowpark Python Pivot-Funktion, dass Sie explizit die Liste der unterschiedlichen Werte angeben, an denen ein Pivot ausgeführt werden soll werden soll.
Szenarien¶
Szenario 1¶
Eingabe
SMA erkennt einen Ausdruck, der dem Muster dataFrame.groupBy("columnX").pivot("columnY")
entspricht und der Pivot hat nicht den values-Parameter.
df.groupBy("date").pivot("category").sum("amount")
Ausgabe
Die SMA fügt eine EWI Meldung hinzu, die darauf hinweist, dass die Pivot-Funktion ohne den Parameter „values“ nicht unterstützt wird.
Außerdem fügt es als zweiten Parameter der Pivot-Funktion eine Listenkomprimierung hinzu, das die Liste der Werte berechnet, die in Spalten umgewandelt werden sollen. Denken Sie daran, dass dieser Vorgang bei großen Datensätzen nicht effizient ist, und es ist ratsam, die Werte explizit anzugeben.
#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")
Empfohlene Korrektur
Für dieses Szenario fügt SMA als zweiten Parameter der Pivot-Funktion eine Listenkomprimierung hinzu, das die Liste der Werte berechnet, die in Spalten umgewandelt werden, aber Sie können auch eine Liste eindeutiger Werte zur Pivot-Ausführung angeben. Gehen Sie wie folgt vor:
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")
Szenario 2¶
Eingabe
SMA konnte keinen Ausdruck erkennen, der dem Muster dataFrame.groupBy("columnX").pivot("columnY")
entspricht und der Pivot hat nicht den values-Parameter.
df1.union(df2).groupBy("date").pivot("category").sum("amount")
Ausgabe
Die SMA fügt eine EWI Meldung hinzu, die darauf hinweist, dass die Pivot-Funktion ohne den Parameter „values“ nicht unterstützt wird.
#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")
Empfohlene Korrektur
Fügen Sie eine Liste eindeutiger Werte hinzu, nach denen ein Pivot ausgeführt werden soll. Gehen Sie wie folgt vor:
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()
Zusätzliche Empfehlungen¶
Die Berechnung der Liste eindeutiger Werte für die Pivot-Funktion ist bei großen Datensätzen nicht effizient und kann zu einem blockierenden Aufruf werden. Bitte überlegen Sie, ob Sie die Liste der unterschiedlichen Werte, auf die Sie ein Pivot ausführen möchten, explizit angeben möchten.
Wenn Sie die Liste der eindeutigen Werte für die Pivot-Funktion nicht explizit angeben möchten (was nicht ratsam ist), können Sie den folgenden Code als zweites Argument der Pivot-Funktion hinzufügen, um die Werte zur Laufzeit zu ermitteln*
[v[0] for v in <df>.select(<column>).distinct().limit(<count>).collect()]]
*_ Ersetzen Sie _ _<df>
durch das entsprechende DataFrame, mit der Spalte, um die gedreht werden soll, und mit der Anzahl der auszuwählenden Zeilen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1042¶
Meldung: pyspark.sql.functions.posexplode hat eine Problemumgehung
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.posexplode erkennt, für das es eine Problemumgehung gibt.
Szenarien¶
Es gibt mehrere Szenarien, mit denen diese Methode umgehen kann, abhängig vom Typ der Spalte, die als Parameter übergeben wird. Es kann sich um eine Liste von Werten
oder ein(e) Zurordnung/Verzeichnis (Schlüssel/Werte)
handeln.
Szenario 1¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung von posexplode
mit der Übergabe einer Liste von Werten als Parameter.
df = spark.createDataFrame(
[Row(a=1,
intlist=[1, 2, 3])])
df.select(posexplode(df.intlist)).collect()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1042
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Um dieselbe Verhaltensweise zu erzielen, verwenden Sie die Methode functions.flatten, lassen Sie zusätzliche Spalten weg und benennen Sie die Namen der Index- und Wertspalten um.
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()
Szenario 2¶
Eingabe
Nachfolgend ein weiteres Beispiel für die Verwendung von posexplode
mit Übergabe als Parameter mit map/dictionary (keys/values)
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()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1042
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie functions.row_number verwenden, um die Position zu ermitteln, und functions.explode mit dem Namen des Feldes, um den Wert des Schlüssels/Wertes für Dictionarys zu erhalten.
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()
Hinweis: mit „row_number“ ist nicht vollständig äquivalent, da es mit 1 beginnt (nicht mit Null wie die Spark-Methode)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1013¶
Meldung: pyspark.sql.functions.acosh hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.acosh erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel berechnet pyspark die acosh für einen Datenframe mithilfe von pyspark.sql.functions.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"]))
Ausgabe
SMA gibt die EWI SPRKPY1013 über die Zeile zurück, in der acosh verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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"]))
Empfohlene Korrektur
Es gibt keine direkte „acosh“-Implementierung, aber es kann stattdessen „call_function“ verwendet werden, wobei „acosh“ als erster Parameter und colName als zweiter Parameter verwendet wird.
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')))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1085¶
Meldung: pyspark.ml.feature.VectorAssembler wird nicht unterstützt.
Kategorie: Warnung
Beschreibung¶
Das pyspark.ml.feature.VectorAssembler wird nicht unterstützt.
Szenario¶
Eingabecode
VectorAssembler wird verwendet, um mehrere Spalten zu einem einzigen Vektor zusammenzufassen.
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")
Ausgabecode
Das Tool fügt diese EWI SPRKPY1085
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Klasse von Snowpark nicht unterstützt wird.
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")
Empfohlene Korrektur
Für das pyspark.ml.feature.VectorAssembler gibt es keine empfohlene Korrektur.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1027¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core 4.5.2
Meldung: pyspark.sql.readwriter.DataFrameReader. json hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.readwriter.DataFrameReader. json-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden sehen Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.readwriter.DataFrameReader.json
, die dieses EWI erzeugt. In diesem Beispiel wird die Funktion json
verwendet, um mehrere . json
-Dateien mit einem bestimmten Schema zu lesen und verwendet einige zusätzliche Optionen wie primitiveAsString und dateFormat, um die Verhaltensweise beim Lesen der Dateien fein abzustimmen.
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"
)
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1027
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"
)
Empfohlene Korrektur
In diesem Abschnitt erklären wir, wie Sie den path
-Parameter, den schema
-Parameter und einige Optionen
konfigurieren, damit sie in Snowpark funktionieren.
1. Pfad Parameter
Snowpark verlangt, dass der Parameter Pfad ein Stagingbereich ist. Als Problemumgehung können Sie einen temporären Stagingbereich erstellen und jede .json
-Datei mit dem Präfix file://
zu diesem Stagingbereich hinzufügen.
2. Schema Parameter
Snowpark erlaubt es nicht, das ****-Schema als Parameter der json
-Funktion zu definieren. Als Problemumgehung können Sie die snowflake.snowpark.DataFrameReader.schema-Funktion verwenden.
3. Optionen Parameter
Snowpark erlaubt es nicht, die ****-Zusatzoptionen als Parameter der json
-Funktion zu definieren. Als Problemumgehung können Sie für viele von ihnen die snowflake.snowpark.DataFrameReader.option-Funktion verwenden, um diese Parameter als Optionen von DataFrameReader anzugeben.
Bemerkung
Die folgenden Optionen werden von Snowpark nicht unterstützt:
allowBackslashEscapingAnyCharacter
allowComments
allowNonNumericNumbers
allowNumericLeadingZero
allowSingleQuotes
allowUnquotedControlChars
allowUnquotedFieldNames
columnNameOfCorruptRecord
dropFiledIfAllNull
Codierung
ignoreNullFields
lineSep
locale
Modus (mode)
mehrzeilig
prefersDecimal
primitiveAsString
samplingRatio
timestampNTZFormat
timeZone
Nachfolgend sehen Sie ein vollständiges Beispiel dafür, wie der Eingabecode nach Anwendung der oben genannten Vorschläge aussehen sollte, damit er in Snowpark funktioniert:
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)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1076¶
Meldung: Parameter in pyspark.sql.readwriter.DataFrameReader-Methoden werden nicht unterstützt. Dies gilt für die Methoden CSV, JSON und PARQUET.
Kategorie: Warnung.
Beschreibung¶
Für die Methoden CSV, JSON und PARQUET des Objekts pyspark.sql.readwriter.DataFrameReader analysiert das Tool die Parameter und fügt eine Transformation für jeden Fall hinzu:
Alle Parameter entsprechen ihrem äquivalenten Namen in Snowpark: In diesem Fall wandelt das Tool den Parameter in einen .option()-Aufruf um. In diesem Fall fügt der Parameter diese EWI nicht hinzu.
Einige Parameter stimmen nicht mit der Äquivalenz in Snowpark überein: In diesem Fall fügt das Tool diese EWI mit den Parameterinformationen hinzu und entfernt sie aus dem Methodenaufruf.
Liste der Äquivalenzen:
Äquivalenzen für CSV:
Spark-Tasten |
Snowpark-Äquivalenzen |
---|---|
sep |
FIELD_DELIMITER |
Header |
PARSE_HEADER |
lineSep |
RECORD_DELIMITER |
pathGlobFilter |
PATTERN |
Anführungszeichen |
FIELD_OPTIONALLY_ENCLOSED_BY |
nullValue |
NULL_IF |
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
inferSchema |
INFER_SCHEMA |
Trennzeichen |
FIELD_DELIMITER |
Äquivalenzen für JSON:
Spark-Tasten |
Snowpark-Äquivalenzen |
---|---|
dateFormat |
DATE_FORMAT |
timestampFormat |
TIMESTAMP_FORMAT |
pathGlobFilter |
PATTERN |
Äquivalenzen für PARQUET:
Spark-Tasten |
Snowpark-Äquivalenzen |
---|---|
pathGlobFilter |
PATTERN |
Szenarien¶
Szenario 1¶
Eingabe
Unter CVS finden Sie einige Beispiele:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.csv("path3", None,None,None,None,None,None,True).show()
Ausgabe
Im konvertierten Code werden die Parameter als einzelne Optionen zur cvs-Funktion hinzugefügt
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()
Szenario 2¶
Eingabe
Unter JSON finden Sie einige Beispiele:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.json("/myPath/jsonFile/", dateFormat='YYYY/MM/DD').show()
Ausgabe
Im konvertierten Code werden die Parameter als einzelne Optionen zur json-Funktion hinzugefügt
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()
Szenario 3¶
Eingabe
Unter PARQUET finden Sie einige Beispiele:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('myapp').getOrCreate()
spark.read.parquet("/path/to/my/file.parquet", pathGlobFilter="*.parquet").show()
Ausgabe
Im konvertierten Code werden die Parameter als individuelle Optionen zur Parkettfunktion hinzugefügt
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")
Zusätzliche Empfehlungen¶
Wenn nicht-äquivalente Parameter vorhanden sind, empfiehlt es sich, die Verhaltensweise nach der Umwandlung zu überprüfen.
Auch die Dokumentation könnte nützlich sein, um eine bessere Lösung zu finden:
Dokumentation der Optionen für CSV:
Dokumentation der Optionen für JSON:
Dokumentation der Optionen für PARQUET:
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1066¶
Meldung: Das Spark-Element trifft nicht zu, da Snowflake automatisch einen Mechanismus zur Mikropartitionierung verwendet.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von Elementen in Verbindung mit Partitionen erkennt:
Diese Elemente gelten nicht aufgrund der Verwendung von Mikro-Partitionen von Snowflake.
Eingabecode
In diesem Beispiel sortWithinPartitions wird es verwendet, um eine Partition in einem DataFrame zu erstellen, der nach der angegebenen Spalte sortiert ist.
df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
df.sortWithinPartitions("age", ascending=False)
Ausgabecode
Die SMA fügt eine EWI-Meldung hinzu, die darauf hinweist, dass das Spark-Element nicht erforderlich ist.
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)
Empfohlene Korrektur
Entfernen Sie die Verwendung des Elements.
df = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1037¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.functions.sort_array hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.sql.functions.sort_array feststellt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.functions.sort_array
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die sort_array
-Funktion verwendet, um das Array numbers in aufsteigender und absteigender Reihenfolge zu sortieren.
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))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1037
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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))
Empfohlene Korrektur
Als Problemumgehung können Sie das Paket snowpark_extensions importieren, das eine Erweiterung für die Funktion sort_array
bietet.
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))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1003¶
Meldunge : Beim Laden der Symboltabelle ist ein Fehler aufgetreten.
Kategoriey : Konvertierungsfehler.
Beschreibung¶
Dieses Problem tritt auf, wenn ein Fehler bei der Verarbeitung der Symbole in der Symboltabelle auftritt. Die Symboltabelle ist Teil der zugrunde liegenden Architektur von SMA und ermöglicht komplexere Konvertierungen. Dieser Fehler könnte auf eine unerwartete Anweisung im Quellcode zurückzuführen sein.
Zusätzliche Empfehlungen ¶
Es ist unwahrscheinlich, dass dies ein Fehler im Quellcode selbst ist, sondern eher ein Fehler in der Art und Weise, wie das Tool den Quellcode verarbeitet. Die beste Lösung wäre, ein Problem in der SMA zu melden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem in der SMA melden.
SPRKPY1052¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 2.8.0
Meldung: pyspark.sql.session.SparkSession.Builder.enableHiveSupport hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.session.SparkSession.Builder.enableHiveSupport erkennt, die eine Problemumgehung bietet.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel, das SparkSession konfiguriert und die Hive-Unterstützung mit der enableHiveSupport
-Methode aktiviert.
spark = Session.builder.appName("Merge_target_table")\
.config("spark.port.maxRetries","100") \
.enableHiveSupport().getOrCreate()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1052
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
#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()
Empfohlene Korrektur
Entfernen Sie die Verwendung der enableHiveSupport
-Funktion, da sie in Snowpark nicht benötigt wird.
spark = Session.builder.appName("Merge_target_table")\
.config("spark.port.maxRetries","100") \
.getOrCreate()
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1043¶
Meldung: pyspark.sql.functions.posexplode_outer hat eine Problemumgehung
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.posexplode_outer erkennt, für das es eine Problemumgehung gibt.
Szenarien¶
Es gibt mehrere Szenarien, mit denen diese Methode umgehen kann, abhängig vom Typ der Spalte, die als Parameter übergeben wird. Es kann sich um eine Liste von Werten
oder ein(e) Zurordnung/Verzeichnis (Schlüssel/Werte)
handeln.
Szenario 1¶
Eingabe
Das folgende Beispiel zeigt die Verwendung von posexplode_outer
bei Übergabe einer Liste von Werten.
df = spark.createDataFrame(
[
(1, ["foo", "bar"]),
(2, []),
(3, None)],
("id", "an_array"))
df.select("id", "an_array", posexplode_outer("an_array")).show()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1043
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Um die gleiche Verhaltensweise zu erzielen, verwenden Sie die Methode functions.flatten, die den Parameter outer
in True sendet, lassen Sie zusätzliche Spalten weg und benennen Sie die Namen der Index- und Wertspalten um.
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()
Szenario 2¶
Eingabe
Nachfolgend ein weiteres Beispiel für die Verwendung von posexplode_outer, das map/dictionary (keys/values) übergibt
df = spark.createDataFrame(
[
(1, {"x": 1.0}),
(2, {}),
(3, None)],
("id", "a_map"))
df.select(posexplode_outer(df.a_map)).show()
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1043
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
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()
Empfohlene Korrektur
Als Problemumgehung können Sie functions.row_number verwenden, um die Position zu erhalten, und functions.explode_outer mit dem Namen des Feldes, um den Wert des Schlüssels/Wertes für Dictionarys zu erhalten.
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()
Hinweis: mit „row_number“ ist nicht vollständig äquivalent, da es mit 1 beginnt (nicht mit Null wie die Spark-Methode)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1012¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.dataframe.DataFrameStatFunctions.writeTo hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.dataframe.DataFrameStatFunctions.writeTo erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel wird der Datenframe df in eine Spark-Tabelle „table“ geschrieben.
writer = df.writeTo("table")
Ausgabe
SMA gibt die EWI SPRKPY1012 über die Zeile zurück, in der DataFrameStatFunctions.writeTo verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
#EWI: SPRKPY1012 => pyspark.sql.dataframe.DataFrameStatFunctions.writeTo has a workaround, see documentation for more info
writer = df.writeTo("table")
Empfohlene Korrektur
Verwenden Sie stattdessen df.write.SaveAsTable().
import df.write as wt
writer = df.write.save_as_table(table)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1084¶
Dieser Problemcode gilt als veraltet bereits seit Spark Conversion Core 4.12.0
Meldung: pyspark.sql.readwriter.DataFrameWriter.option wird nicht unterstützt.
Kategorie: Warnung
Beschreibung¶
Die Funktion pyspark.sql.readwriter.DataFrameWriter.option wird nicht unterstützt.
Szenario¶
Eingabecode
Nachfolgend finden Sie ein Beispiel für die option
-Methode. Diese Methode wird verwendet, um beim Schreiben der Daten eines DataFrame zusätzliche Konfigurationen hinzuzufügen.
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)
Ausgabecode
Das Tool fügt diese EWI SPRKPY1084
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark nicht unterstützt wird.
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)
Empfohlene Korrektur
Für die pyspark.sql.readwriter.DataFrameWriter.option-Methode gibt es keine empfohlene Lösung.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1026¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core 4.3.2
Meldung: pyspark.sql.readwriter.DataFrameReader. csv hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.readwriter.DataFrameReader.csv-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.readwriter.DataFrameReader.csv
, die diese EWI erzeugt. In diesem Beispiel wird die Funktion csv
verwendet, um mehrere . csv
-Dateien mit einem bestimmten Schema zu lesen und einige zusätzliche Optionen wie encoding, header und sep zu verwenden, um die Verhaltensweise beim Lesen der Dateien feinabzustimmen.
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=","
)
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1026
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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=","
)
Empfohlene Korrektur
In diesem Abschnitt erklären wir, wie Sie den path
-Parameter, den schema
-Parameter und einige Optionen
konfigurieren, damit sie in Snowpark funktionieren.
1. Pfad Parameter
Snowpark verlangt, dass der Parameter Pfad ein Stagingbereich ist. Als Problemumgehung können Sie einen temporären Stagingbereich erstellen und jede .csv
-Datei mit dem Präfix file://
zu diesem Stagingbereich hinzufügen.
2. Schema Parameter
Snowpark erlaubt es nicht, das ****-Schema als Parameter der csv
-Funktion zu definieren. Als Problemumgehung können Sie die snowflake.snowpark.DataFrameReader.schema-Funktion verwenden.
3. Optionen Parameter
Snowpark erlaubt es nicht, die ****-Zusatzoptionen als Parameter der csv
-Funktion zu definieren. Als Problemumgehung können Sie für viele von ihnen die snowflake.snowpark.DataFrameReader.option-Funktion verwenden, um diese Parameter als Optionen von DataFrameReader anzugeben.
Bemerkung
Die folgenden Optionen werden von Snowpark nicht unterstützt:
columnNameOfCorruptRecord
emptyValue
enforceSchema
Header
ignoreLeadingWhiteSpace
ignoreTrailingWhiteSpace
inferSchema
locale
maxCharsPerColumn
maxColumns
Modus (mode)
mehrzeilig
nanValue
negativInf
nullValue
positivInf
quoteAll
samplingRatio
timestampNTZFormat
unescapedQuoteHandling
Nachfolgend sehen Sie ein vollständiges Beispiel dafür, wie der Eingabecode nach Anwendung der oben genannten Vorschläge aussehen sollte, damit er in Snowpark funktioniert:
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)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1077¶
Meldung: SQL eingebetteter Code kann nicht verarbeitet werden.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool einen SQL-eingebetteten Code erkennt, der nicht in Snowpark konvertiert werden kann.
Weitere Informationen finden Sie im Abschnitt „SQL-eingebetteter Code“.
Szenario¶
Eingabe
In diesem Beispiel ist der SQL-Code in eine Variable namens „Abfrage“ (query) eingebettet, die als Parameter für die Pyspark.sql-Methode verwendet wird.
query = f"SELECT * from myTable"
spark.sql(query)
Ausgabe
SMA erkennt, dass es sich bei dem Parameter PySpark.sql um eine Variable und nicht um einen SQL-Code handelt, so dass die Meldung EWI SPRKPY1077 zur Zeile PySpark.sql hinzugefügt wird.
query = f"SELECT * myTable"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
spark.sql(query)
Zusätzliche Empfehlungen¶
Für die Transformation von SQL muss dieser Code direkt als Parameter der Methode nur als Zeichenfolgewerte und ohne Interpolation enthalten sein. Bitte prüfen Sie die SQL, die an PySpark.SQL gesendet wird, um die Funktionalität auf Snowflake zu validieren.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1067¶
Meldung: Die Funktion pyspark.sql.functions.split hat Parameter, die in Snowpark nicht unterstützt werden.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.split mit mehr als zwei Parametern oder einem Regex-Muster als Parameter erkennt; beide Fälle werden nicht unterstützt.
Szenarien¶
Szenario 1¶
Eingabecode
In diesem Beispiel hat die Split-Funktion mehr als zwei Parameter.
df.select(split(columnName, ",", 5))
Ausgabecode
Das Tool fügt diese EWI in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion nicht unterstützt wird, wenn sie mehr als zwei Parameter hat.
#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))
Empfohlene Korrektur
Behalten Sie die Split-Funktion mit nur zwei Parametern bei.
df.select(split(columnName, ","))
Szenario 2¶
Eingabecode
In diesem Beispiel hat die Split-Funktion ein Regex-Muster als Parameter.
df.select(split(columnName, "^([\d]+-[\d]+-[\d])"))
Ausgabecode
Das Tool fügt diese EWI in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Funktion nicht unterstützt wird, wenn sie ein Regex-Muster als Parameter hat.
#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])"))
Empfohlene Korrektur
Die Spark-Signatur für diese Methode functions.split(str: ColumnOrName, pattern: str, limit: int = - 1)
stimmt nicht genau mit der Methode in Snowpark functions.split(str: Union [Column, str], pattern: Union [Column, str])
überein, so dass es für das Szenario mit dem regulären Ausdruck vorerst keine empfohlene Lösung gibt.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1036¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.column.Column.getField hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.column.Column.getField-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der pyspark.sql.column.Column.getField
-Funktion, die dieses EWI erzeugt. In diesem Beispiel wird die getField
-Funktion verwendet, um den Namen****aus der Spalte** info** zu extrahieren.
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"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1036
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie den Snowpark-Spaltenindexierungsoperator mit dem Namen des Feldes als Index verwenden.
df = spark.createDataFrame([(1, {"name": "John", "age": 30}), (2, {"name": "Jane", "age": 25})], ["id", "info"])
df_with_name = df.withColumn("name", col("info")["name"])
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1002¶
Meldunge : < element > wird nicht unterstützt. Spark-Element nicht unterstützt.
Kategoriey : Konvertierungsfehler.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung eines Elements erkennt, das in Snowpark nicht unterstützt wird und für das kein eigener Fehlercode existiert. Dies ist der allgemeine Fehlercode, der von SMA für ein nicht unterstütztes Element verwendet wird.
Zusätzliche Empfehlungen¶
Auch wenn die Option oder das Element in der Nachricht nicht unterstützt wird, bedeutet dies nicht, dass keine Lösung gefunden werden kann. Es bedeutet nur, dass das Tool selbst keine Lösung finden kann.
Wenn Sie auf ein nicht unterstütztes Element aus einer pyspark.ml Bibliothek gestoßen sind, sollten Sie eine Alternative in Erwägung ziehen. Es gibt weitere Leitfäden, die sich mit Problemen im Zusammenhang mit ml befassen, wie z. B. dieser von Snowflake.
Prüfen Sie, ob der Quellcode die richtige Syntax hat. (Sie können die Datei issues.csv verwenden, um festzustellen, wo der/die Konvertierungsfehler auftritt/auftreten) Wenn die Syntax korrekt ist, melden Sie einen Konvertierungsfehler für ein bestimmtes Element mit der Option „Problem melden“ auf SMA. Geben Sie die Codezeile, die den Fehler verursacht hat, in der Beschreibung an, wenn Sie dieses Problem melden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1053¶
Meldung: Beim Extrahieren der dbc-Dateien ist ein Fehler aufgetreten.
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn eine dbc-Datei nicht extrahiert werden kann. Diese Warnung könnte durch einen oder mehrere der folgenden Gründe verursacht werden: Zu schwer, unzugänglich, schreibgeschützt, usw.
Zusätzliche Empfehlungen¶
Als Problemumgehung können Sie die Größe der Datei überprüfen, wenn sie zu groß ist, um verarbeitet zu werden. Analysieren Sie auch, ob das Tool darauf zugreifen kann, um Zugriffsprobleme zu vermeiden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-info@snowflake.com senden. Wenn Sie einen Supportvertrag mit Snowflake abgeschlossen haben, wenden Sie sich an Ihren Vertriebsingenieur, der Ihren Supportbedarf ermitteln kann.
SPRKPY1080¶
Meldung: Der Wert von SparkContext wird durch die Variable ‚session‘ ersetzt.
Kategorie: Warnung
Beschreibung¶
Der Spark-Kontext wird in einer Variablen namens „session“ gespeichert, die eine Snowpark-Sitzung erstellt.
Szenario¶
Eingabe
Dieser Codeausschnitt beschreibt ein SparkContext
## Input Code
from pyspark import SparkContext
from pyspark.sql import SparkSession
def example1():
sc = SparkContext("local[*]", "TestApp")
sc.setLogLevel("ALL")
sc.setLogLevel("DEBUG")
Ausgabe
In diesem Ausgabecode hat SMA die PySpark.SparkContext durch eine SparkSession ersetzt. Beachten Sie, dass SMA auch eine Vorlage hinzufügt, um die Verbindung in der „connection.json“-Datei zu ersetzen und diese Konfiguration dann in die connection_parameter-Variable zu laden.
## 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)
Empfohlene Korrektur
Die „connection.json“-Konfigurationsdatei muss mit den erforderlichen Verbindungsinformationen aktualisiert werden:
{
"user": "my_user",
"password": "my_password",
"account": "my_account",
"role": "my_role",
"warehouse": "my_warehouse",
"database": "my_database",
"schema": "my_schema"
}
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1073¶
Meldung: pyspark.sql.functions.udf ohne Parameter oder Rückgabeparameter werden nicht unterstützt
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.udf als Funktion oder Decorator erkennt und in zwei spezifischen Fällen nicht unterstützt wird, nämlich wenn es keine Parameter oder Rückgabeparameter hat.
Szenarien¶
Szenario 1¶
Eingabe
In Pyspark können Sie eine benutzerdefinierte Funktion ohne Eingabe- oder Rückgabeparameter erstellen:
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()
Ausgabe
Snowpark benötigt die Eingabe- und Rückgabetypen für die Udf-Funktion. Denn sie werden nicht bereitgestellt, und SMA kann diese Parameter nicht bereitstellen.
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()
Empfohlene Korrektur
Um dieses Szenario zu korrigieren, ist es erforderlich, den Import für die Rückgabetypen der Eingabe und der Ausgabe und dann die Parameter der Rückgabetype und input_types[] auf die udf-Funktion _my_udf hinzuzufügen.
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()
Szenario 2¶
In PySpark können Sie einen @udf-Decorator ohne Parameter verwenden
Eingabe
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()
Ausgabe
In Snowpark sind alle Parameter eines udf –Decorators erforderlich.
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()
Empfohlene Korrektur
Um dieses Szenario zu beheben, müssen Sie den Import für die Rückgabetypen der Eingabe und der Ausgabe und dann die Parameter von return_type und input_types[] auf dem udf @udf.-Decorator hinzufügen.
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()
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1022¶
Meldung: pyspark.sql.functions.log10 hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.functions.log10-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.functions.log10
, die diese EWI erzeugt. In diesem Beispiel wird die Funktion log10
verwendet, um den Basis 10-Logarithmus der Wert-Spalte zu berechnen.
df = spark.createDataFrame([(1,), (10,), (100,), (1000,), (10000,)], ["value"])
df_with_log10 = df.withColumn("log10_value", log10(df["value"]))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1022
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"]))
Empfohlene Korrektur
Als Problemumgehung können Sie die snowflake.snowpark.functions.log-Funktion verwenden, indem Sie als Basis den Literalewert 10
übergeben.
df = spark.createDataFrame([(1,), (10,), (100,), (1000,), (10000,)], ["value"])
df_with_log10 = df.withColumn("log10_value", log(10, df["value"]))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1016¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 0.11.7
Meldung: pyspark.sql.functions.collect_set hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.collect_set erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Verwenden Sie den collectset, um die Elemente von _colname ohne Duplikate zu erhalten:
col = collect_set(colName)
Ausgabe
SMA gibt die EWI SPRKPY1016 über die Zeile zurück, in der collect_set verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
#EWI: SPRKPY1016 => pyspark.sql.functions.collect_set has a workaround, see documentation for more info
col = collect_set(colName)
Empfohlene Korrektur
Verwenden Sie die array_agg-Funktion, und fügen Sie ein zweites Argument mit dem True-Wert hinzu.
col = array_agg(col, True)
Zusätzliche Empfehlung¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1047¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.6.0
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.context.SparkContext.setLogLevel erkennt, das eine Problemumgehung bietet.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der Methode setLogLevel
.
sparkSession.sparkContext.setLogLevel("WARN")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1047
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
#EWI: SPRKPY1047 => pyspark.context.SparkContext.setLogLevel has a workaround, see documentation for more info
sparkSession.sparkContext.setLogLevel("WARN")
Empfohlene Korrektur
Ersetzen Sie die setLogLevel
-Funktionsverwendung durch logging.basicConfig
, die eine Reihe von Komfortfunktionen für die einfache Verwendung der Protokollierung bietet. Um es zu verwenden, müssen wir zwei Module importieren, „logging“ und „sys“, und die Level-Konstante sollte durch die „Ebenen-Äquivalent-Tabelle“ ersetzt werden:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.WARNING)
Ebenen-Äquivalent-Tabelle
Ebenen-Quellen-Parameter |
Ebenen-Ziel-Parameter |
---|---|
„ALL“ |
Dies hat kein Äquivalent _ |
„DEBUG“ |
Protokollieren.DEBUG |
„ERROR“ |
Protokollieren.ERROR |
„FATAL“ |
Protokollieren.CRITICAL |
„INFO“ |
Protokollieren.INFO |
„OFF“ |
Protokollieren.NOTSET |
„TRACE“ |
Dies hat kein Äquivalent _ |
„WARN“ |
Protokollieren.WARNING |
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1057¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldung: PySparkDataframe-Option -Argument enthält einen Wert, der kein Literal ist und daher nicht ausgewertet werden kann
Kategorie: Warnung.
Beschreibung¶
Dieser Ausgabecode ist veraltet. Wenn Sie eine ältere Version verwenden, führen Sie ein Upgrade auf die neueste Version aus.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1006¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldunge : pyspark.context.SparkContext ist nicht erforderlich
Kategoriey : Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.context.SparkContext erkennt, die in Snowflake nicht erforderlich ist.
Szenario¶
Eingabe
In diesem Beispiel gibt es zwei Kontexte, eine Verbindung zu einem Spark-Cluster herzustellen
from pyspark import SparkContext
sql_context1 = SparkContext(my_sc1)
sql_context2 = SparkContext(sparkContext=my_sc2)
Ausgabe
Da es auf Snowflake keine Cluster gibt, ist der Kontext nicht erforderlich. Beachten Sie, dass die Variablen my_sc1 und my_sc2, die Spark-Eigenschaften enthalten, möglicherweise nicht erforderlich sind oder angepasst werden müssen, um den Code zu korrigieren.
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
Zusätzliche Empfehlungen¶
Hier wird ein unnötiger Parameter entfernt und ein Warnkommentar eingefügt. Der Benutzer muss nichts unternehmen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1032¶
Meldung: _ spark element _ ist nicht definiert
Kategorie: Konvertierungsfehler
Beschreibung¶
Dieses Problem tritt auf, wenn SMA keinen geeigneten Zuordnungsstatus für das angegebene Element ermitteln konnte. Das bedeutet, dass SMA noch nicht weiß, ob dieses Element von Snowpark unterstützt wird oder nicht. Bitte beachten Sie, dass dies ein allgemeiner Fehlercode ist, der von SMA für jedes nicht definierte Element verwendet wird.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für eine Funktion, für die SMA keinen geeigneten Zuordnungsstatus ermitteln konnte. In diesem Fall sollten Sie davon ausgehen, dass not_defined_function()
eine gültige PySpark-Funktion ist und der Code ausgeführt wird.
sc.parallelize(["a", "b", "c", "d", "e"], 3).not_defined_function().collect()
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1032
hinzu, um Sie darauf hinzuweisen, dass dieses Element nicht definiert ist.
#EWI: SPRKPY1032 => pyspark.rdd.RDD.not_defined_function is not defined
sc.parallelize(["a", "b", "c", "d", "e"], 3).not_defined_function().collect()
Empfohlene Korrektur
Um zu versuchen, das Problem zu identifizieren, können Sie die folgenden Überprüfungen durchführen:
Prüfen Sie, ob der Quellcode die richtige Syntax hat und richtig geschrieben ist.
Prüfen Sie, ob Sie eine PySpark-Version verwenden, die von SMA unterstützt wird. Um zu erfahren, welche PySpark-Version von SMA zum Zeitpunkt der Ausführung von SMA unterstützt wird, können Sie die erste Seite der
DetailedReport. docx
-Datei einsehen.
Wenn es sich um ein gültiges Element von PySpark handelt, melden Sie bitte über die Option Problem melden der Website SMA, dass bei diesem Element ein Konvertierungsfehler aufgetreten ist, und fügen Sie alle zusätzlichen Informationen hinzu, die Sie für hilfreich halten.
Bitte beachten Sie: Wenn ein Element nicht definiert ist, bedeutet das nicht, dass es von Snowpark nicht unterstützt wird. Sie sollten in der Snowpark-Dokumentation nachsehen, ob es ein äquivalentes Element gibt.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1063¶
Meldung: pyspark.sql.pandas.functions.pandas_udf bietet eine Problemumgehung.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.pandas.functions.pandas_udf erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Die Funktion pandas_udf wird verwendet, um eine benutzerdefinierte Funktion zu erstellen, die mit großen Datenmengen arbeitet.
@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)
Ausgabe
Die SMA fügt eine EWI-Meldung hinzu, die darauf hinweist, dass pandas_udf über eine Problemumgehung verfügt.
#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)
Empfohlene Korrektur
Geben Sie die Parametertypen explizit als neuen input_types
-Parameter an und entfernen Sie den Parameter functionType
, falls zutreffend. Die erstellte Funktion muss innerhalb einer Select-Anweisung aufgerufen werden.
@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
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1078¶
Meldung: Das Argument der Funktion pyspark.context.SparkContext.setLogLevel ist kein Literalwert und konnte daher nicht ausgewertet werden
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der Funktion pyspark.context.SparkContext.setLogLevel mit einem Argument erkennt, das kein Literalwert ist, z. B. wenn das Argument eine Variable ist.
SMA führt eine statische Analyse Ihres Quellcodes durch. Daher ist es nicht möglich, den Inhalt dieses Arguments auszuwerten und eine Äquivalenz in Snowpark zu ermitteln.
Szenario¶
Eingabe
In diesem Beispiel wird der LogLevel in der Variablen my_log_level definiert und my_log_level als Parameter für die setLogLevel-Methode verwendet.
my_log_level = "WARN"
sparkSession.sparkContext.setLogLevel(my_log_level)
Ausgabe
SMA ist nicht in der Lage, das Argument für den Protokolliergrad-Parameter auszuwerten, daher wird die EWI SPRKPY1078 über der Zeile der transformierten Protokollierung hinzugefügt:
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)
Empfohlene Korrektur
Auch wenn SMA das Argument nicht auswerten konnte, wird es die Funktion pyspark.context.SparkContext.setLogLevel
in das Snowpark-Äquivalent umwandeln. Bitte vergewissern Sie sich, dass der Wert des level
-Arguments im generierten Ausgabecode ein gültiger und äquivalenten Protokolliergrad in Snowpark ist, wie in der folgenden Tabelle angegeben:
PySpark-Protokolliergrad |
Snowpark-Protokolliergrad äquivalent |
---|---|
ALL |
Protokollieren.NOTSET |
DEBUG |
Protokollieren.DEBUG |
ERROR |
Protokollieren.ERROR |
FATAL |
Protokollieren.CRITICAL |
INFO |
Protokollieren.INFO |
OFF |
Protokollieren.WARNING |
TRACE |
Protokollieren.NOTSET |
WARN |
Protokollieren.WARNING |
Die empfohlene Lösung sieht also so aus:
my_log_level = logging.WARNING
logging.basicConfig(stream = sys.stdout, level = my_log_level)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1029¶
Meldung: Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.readwriter.DataFrameReader.parquet erkennt Diese Funktion wird unterstützt, aber einige der Unterschiede zwischen Snowpark und Spark API erfordern möglicherweise einige manuelle Änderungen.
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der Funktion pyspark.sql.readwriter.DataFrameReader. parquet feststellt. Diese Funktion wird von Snowpark unterstützt, allerdings gibt es einige Unterschiede, die einige manuelle Änderungen erfordern würden.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der pyspark.sql.readwriter.DataFrameReader. parquet
-Funktion, die diese EWI erzeugt.
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"
)
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1029
hinzu, um Sie darauf hinzuweisen, dass diese Funktion von Snowpark unterstützt wird, aber einige manuelle Anpassungen erfordert. Bitte beachten Sie, dass die von Snowpark unterstützten Optionen in option
-Funktionsaufrufe umgewandelt und die nicht unterstützten Optionen entfernt werden. Dies wird in den nächsten Abschnitten ausführlicher erklärt.
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
)
Empfohlene Korrektur
In diesem Abschnitt erklären wir, wie Sie die Parameter paths
und options
konfigurieren, damit sie in Snowpark funktionieren.
1. paths-Parameter
In Spark kann dieser Parameter ein lokaler oder ein Cloud-Speicherort sein. Snowpark akzeptiert nur Cloud-Speicherorte, die einen Snowflake-Stagingbereich verwenden. Sie können also einen zeitlichen Stagingbereich erstellen und jede Datei mit dem Präfix file://
in diesen Bereich einfügen.
2. Optionen Parameter
Snowpark erlaubt es nicht, die verschiedenen Optionen als Parameter der parquet
-Funktion zu definieren. Als Problemumgehung können Sie die Funktionen Option oder Optionen verwenden, um diese Parameter als zusätzliche Optionen von DataFrameReader anzugeben.
Bitte beachten Sie, dass die Snowpark options nicht genau mit den PySpark options übereinstimmen, so dass einige manuelle Änderungen erforderlich sein könnten. Nachfolgend finden Sie eine genauere Erklärung, wie Sie die gängigsten PySpark-Optionen in Snowpark konfigurieren.
2.1 mergeSchema Option
Parquet unterstützt die Schemaentwicklung, so dass Benutzer mit einem einfachen Schema beginnen und nach und nach weitere Spalten hinzufügen können. Dies kann zu mehreren Parquet-Dateien mit unterschiedlichen, aber kompatiblen Schemata führen. In Snowflake müssen Sie das dank der infer_schema–Funktionen nicht tun, und daher kann die mergeSchema
-Option einfach entfernt werden.
2.2 pathGlobFilter Option
Wenn Sie nur eine Teilmenge von Dateien aus dem Stagingbereich laden möchten, können Sie mit der pattern
-Option einen regulären Ausdruck angeben, der auf die zu ladenden Dateien passt. Die SMA automatisiert dies bereits, wie Sie an der Ausgabe dieses Szenarios sehen können.
2.3 recursiveFileLookupstr Option
Diese Option wird von Snowpark nicht unterstützt. Die beste Empfehlung ist die Verwendung eines regulären Ausdrucks wie bei der Option pathGlobFilter
, um etwas Ähnliches zu erreichen.
2.4 modifiedBefore / modifiedAfter-Option
Sie können das gleiche Ergebnis in Snowflake erzielen, indem Sie die Spalten metadata
verwenden.
Bemerkung
Die folgenden Optionen werden von Snowpark nicht unterstützt:
Kompression
datetimeRebaseMode
int96RebaseMode
mergeSchema
Nachfolgend finden Sie ein vollständiges Beispiel dafür, wie der Eingabecode umgewandelt werden sollte, damit er in Snowpark funktioniert:
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')
Zusätzliche Empfehlungen¶
In Snowflake können Sie andere Ansätze für die Aufnahme von Parquet-Daten nutzen, wie z. B:
Nutzung der nativen Parquet-Ingestion-Funktionen. Beachten Sie auch autoingest mit snowpipe.
Externe Parquet-Tabellen, die direkt auf Cloud-Dateispeicherorte verweisen können.
Bei einer Migration empfiehlt es sich, die SMA-Berichte zu nutzen, um eine Bestandsaufnahme der Dateien vorzunehmen und zu ermitteln, welchen Stagingbereichen/Tabellen die Daten nach der Modernisierung zugeordnet werden sollen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1039¶
Warnung
Dieser Problemcode ist jetzt veraltet
Meldung: pyspark.sql.column.Column.getItem hat eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.column.Column.getItem-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung der pyspark.sql.column.Column.getItem
-Funktion, die diese EWI erzeugt. In diesem Beispiel wird die Funktion getItem
verwendet, um ein Element nach Position und nach Schlüssel zu suchen.
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"))
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1039
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"))
Empfohlene Korrektur
Als Problemumgehung können Sie den Snowpark-Spaltenindexierungsoperator mit dem Namen oder der Position des Feldes als Index verwenden.
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"])
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1068¶
Meldung: toPandas enthält Spalten vom Typ ArrayType, der nicht unterstützt wird und für den es eine Problemumgehung gibt.
Kategorie: Warnung
Beschreibung¶
pyspark.sql.DataFrame.toPandas funktioniert nicht richtig, wenn es Spalten vom Typ ArrayType gibt. Die Problemumgehung für diese Fälle ist die Konvertierung dieser Spalten in ein Python Dictionary mit der json.loads-Methode.
Szenario¶
Eingabe
ToPandas gibt die Daten der ursprünglichen DataFrame als Pandas DataFrame zurück.
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()
Ausgabe
Das Tool fügt diese EWI hinzu, um Sie darauf hinzuweisen, dass toPandas nicht unterstützt wird, wenn es Spalten des Typs ArrayType gibt, bietet aber eine Problemumgehung.
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()
Empfohlene Korrektur
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)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1048¶
Warnung
Dieser Problemcode gilt als veraltet seit Spark Conversion Core Version 2.4.0
Meldung: pyspark.sql.session.SparkSession. conf hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.session.SparkSession.conf erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel dafür, wie Sie eine Konfiguration in der Eigenschaft conf
vornehmen.
spark.conf.set("spark.sql.crossJoin.enabled", "true")
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1048
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
#EWI: SPRKPY1048 => pyspark.sql.session.SparkSession.conf has a workaround, see documentation for more info
spark.conf.set("spark.sql.crossJoin.enabled", "true")
Empfohlene Korrektur
SparkSession.conf wird verwendet, um einige spezielle Einstellungen zu übergeben, die nur von Pyspark verwendet werden und nicht für Snowpark gelten. Sie können den Code entfernen oder kommentieren
#spark.conf.set("spark.sql.crossJoin.enabled", "true")
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1019¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldung: pyspark.sql.functions.datediff hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.datediff erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel verwenden wir datediff, um die Tagesdifferenz von „heute“ und anderen Daten zu berechnen.
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'))
)
Ausgabe
SMA gibt die EWI SPRKPY1019 über die Zeile zurück, in der datediff verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
from pyspark.sql.functions import datediff
#EWI: SPRKPY1019 => pyspark.sql.functions.datediff has a workaround, see documentation for more info
contacts = (contacts
#days since last event
.withColumn('daysSinceLastEvent', datediff(lit(today),'lastEvent'))
#days since deployment
.withColumn('daysSinceLastDeployment', datediff(lit(today),'lastDeploymentEnd'))
#days since online training
.withColumn('daysSinceLastTraining', datediff(lit(today),'lastTraining'))
#days since last RC login
.withColumn('daysSinceLastRollCallLogin', datediff(lit(today),'adx_identity_lastsuccessfullogin'))
#days since last EMS login
.withColumn('daysSinceLastEMSLogin', datediff(lit(today),'vms_lastuserlogin'))
)
SMA konvertieren Sie pyspark.sql.functions.datediff in snowflake.snowpark.functions.daydiff, das auch den Unterschied in Tagen zwischen zwei Daten berechnet.
Empfohlene Korrektur
datediff(part: string ,end: ColumnOrName, start: ColumnOrName)
Aktion: Importieren Sie snowflake.snowpark.functions, die eine Implementierung für die Funktion datediff enthält, die einen zusätzlichen Parameter für den Datum-Zeit-Teil benötigt und mehr Vielseitigkeit bei der Berechnung von Datumsunterschieden ermöglicht.
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'))
)
Empfehlung¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1009¶
Meldunge : pyspark.sql.dataframe.DataFrame.approxQuantile beitet eine Problemumgehung
Kategoriey : Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.dataframe.DataFrame.approxQuantile erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Es ist wichtig zu verstehen, dass Pyspark zwei verschiedene approxQuantile-Funktionen verwendet, hier verwenden wir die DataFrame approxQuantile-Version
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)
Ausgabe
SMA gibt die EWI SPRKPY1009 über die Zeile zurück, in der approxQuantile verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
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)
Empfohlene Korrektur
Verwenden Sie die approxQuantile-Methode von Snowpark. Einige Parameter stimmen nicht überein, so dass sie manuell angepasst werden müssen. Für das Beispiel des Ausgabecodes könnte eine empfohlene Korrektur lauten:
from snowflake.snowpark import Session
...
df = spark.createDataFrame(data, columns)
df.stat.approx_quantile('Ammount', [0.25, 0.5, 0.75])
pyspark.sql.dataframe.DataFrame.approxQuantile’s relativeError-Parameter existiert nicht in SnowPark.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1058¶
Meldung: < Methode > mit < Schlüssel > Plattformspezifischer Schlüssel wird nicht unterstützt.
Kategorie: ConversionError
Beschreibung¶
Die Methoden get
und set
aus pyspark.sql.conf.RuntimeConfig werden nicht mit einem plattformspezifischen Schlüssel unterstützt.
Szenarien¶
Nicht alle Verwendungen der Methoden get
oder set
werden ein EWI im Ausgabecode haben. Diese EWI wird angezeigt, wenn das Tool die Verwendung dieser Methoden mit einem plattformspezifischen Schlüssel feststellt, der nicht unterstützt wird.
Szenario 1¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Methoden get
oder set
mit unterstützten Schlüsseln in Snowpark.
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")
Ausgabe
Da die Schlüssel in Snowpark unterstützt werden, fügt das Tool die EWI nicht in den Ausgabecode ein.
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")
Empfohlene Korrektur
Für dieses Szenario gibt es keine empfohlene Lösung.
Szenario 2¶
Eingabe
Nachfolgend finden Sie ein Beispiel mit nicht unterstützten Schlüsseln.
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"])
Ausgabe
Das Tool fügt diese EWI SPRKPY1058
in den Ausgabecode ein, um Sie darauf hinzuweisen, dass diese Methoden nicht mit einem plattformspezifischen Schlüssel unterstützt werden.
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"])
Empfohlene Korrektur
Die empfohlene Korrektur ist, diese Methoden zu entfernen.
data =
[
("John", 30, "New York"),
("Jane", 25, "San Francisco")
]
df = spark.createDataFrame(data, schema=["Name", "Age", "City"])
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1049¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 2.1.9
Meldung: pyspark.sql.session.SparkSession.sparkContext hat eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.session.SparkSession.sparkContext erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel, das eine Spark-Sitzung erstellt und dann die Eigenschaft SparkContext
verwendet, um den appName zu drucken.
print("APP Name :"+spark.sparkContext.appName())
Ausgabe
Das Tool fügt die Adresse EWI SPRKPY1049
hinzu und weist darauf hin, dass eine Problemumgehung implementiert werden kann.
#EWI: SPRKPY1049 => pyspark.sql.session.SparkSession.sparkContext has a workaround, see documentation for more info
print("APP Name :"+spark.sparkContext.appName())
Empfohlene Korrektur
SparkContext wird in SnowPark nicht unterstützt, aber Sie können auf die Methoden und Eigenschaften von SparkContext direkt von der Sitzungsinstanz aus zugreifen.
## 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());
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1018¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 4.8.0
Meldung: pyspark.sql.functions.date_sub bietet eine Problemumgehung
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.functions.date_sub erkennt, für das es eine Problemumgehung gibt.
Szenario¶
Eingabe
In diesem Beispiel verwenden wir date_add, um das Datum 5 Tage vor dem aktuellen Datum für den Datenframe df zu berechnen.
col = df.select(date_sub(df.colName, 5))
Ausgabe
SMA gibt die EWI SPRKPY1018 über die Zeile zurück, in der date_sub verwendet wird, so dass Sie damit feststellen können, wo Sie korrigieren müssen.
#EWI: SPRKPY1018 => pyspark.sql.functions.date_sub has a workaround, see documentation for more info
col = df.select(date_sub(df.colName, 5))
Empfohlene Korrektur
Importieren Sie snowflake.snowpark.functions, die eine Implementierung für die Funktion date_sub enthält.
from pyspark.sql.functions import date_sub
df.withColumn("date", date_sub(df.colName, 5))
Zusätzliche Empfehlung¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1008¶
Meldung: pyspark.sql.context.HiveContext ist nicht erforderlich
Kategorie: Warnung.
Beschreibung¶
Dieses Problem tritt auf, wenn das Tool die Verwendung von pyspark.sql.context.HiveContext erkennt, die nicht erforderlich ist.
Szenario¶
Eingabe
In diesem Beispiel wird eine Verbindung zu einem Hive-Speicher erstellt.
from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
df = hive_context.table("myTable")
df.show()
Ausgabe
In Snowflake gibt es keine Hive-Speicher, so dass der Hive-Kontext nicht erforderlich ist. Sie können trotzdem Parquet-Dateien in Snowflake verwenden, wie in dieser Anleitung beschrieben.
#EWI: SPRKPY1008 => pyspark.sql.context.HiveContext is not required
hive_context = sc
df = hive_context.table("myTable")
df.show()
die Variable sc bezieht sich auf ein Snow Park-Sitzungsobjekt
Empfohlene Korrektur
Für den Ausgabecode im Beispiel sollten Sie das Snow Park-Sitzungsobjekt ähnlich wie diesen Code hinzufügen:
## 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()
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1059¶
Warnung
Dieser Problemcode ist veraltet bereits seit Spark Conversion Core Version 2.45.1
Meldung: pyspark.storagelevel.StorageLevel bietet eine Problemumgehung, siehe Dokumentation.
Kategorie: Warnung
Beschreibung¶
Derzeit ist die Verwendung von StorageLevel in Snowpark nicht erforderlich, da Snowflake die Speicherung kontrolliert. Weitere Informationen finden Sie in der Datei EWI SPRKPY1072
Zusätzliche Empfehlungen¶
Aktualisieren Sie Ihre Anwendung auf die neueste Version.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1079¶
Meldung: Das Argument der Funktion pyspark.context.SparkContext.setLogLevel ist kein gültiger PySpark-Protokolliergrad
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA die Verwendung der pyspark.context.SparkContext.setLogLevel-Funktion mit einem Argument erkennt, das kein gültiger Protokolliergrad in PySpark ist. Daker konnte in Snowpark kein Äquivalent ermittelt werden.
Szenario¶
Eingabe
hier verwendet der Protokolliergrad „INVALID_LOG_LEVEL “, der kein gültiger Pyspark-Protokolliergrad ist.
sparkSession.sparkContext.setLogLevel("INVALID_LOG_LEVEL")
Ausgabe
SMA den Protokolliergrad „INVALID_LOG_LEVEL“ nicht erkennen kann, obwohl SMA die Konvertierung vornimmt, wird EWI SPRKPY1079 hinzugefügt, um ein mögliches Problem anzuzeigen.
#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)
Empfohlene Korrektur
Stellen Sie sicher, dass der Protokolliergrad, der in der Funktion pyspark.context.SparkContext.setLogLevel verwendet wird, ein gültiger Protokolliergrad in PySpark oder in Snowpark ist, und versuchen Sie es erneut.
logging.basicConfig(stream = sys.stdout, level = logging.DEBUG)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1028¶
Meldung: pyspark.sql.readwriter.DataFrameReader.orc bietet eine Problemumgehung, siehe Dokumentation für weitere Informationen
Kategorie: Warnung
Beschreibung¶
Dieses Problem tritt auf, wenn SMA eine Verwendung der pyspark.sql.readwriter.DataFrameReader.orc-Funktion erkennt, für die es eine Problemumgehung gibt.
Szenario¶
Eingabe
Im Folgenden finden Sie ein Beispiel für die Verwendung der Funktion pyspark.sql.readwriter.DataFrameReader.orc
, die diese EWI erzeugt. In diesem Beispiel wird die Funktion orc
verwendet, um mehrere .orc
-Dateien zu lesen und verwendet einige zusätzliche Optionen wie mergeSchema und recursiveFileLookup, um die Verhaltensweise beim Lesen der Dateien fein abzustimmen.
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"
)
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1028
hinzu, um Sie darauf hinzuweisen, dass diese Funktion nicht direkt von Snowpark unterstützt wird, aber es eine Problemumgehung gibt.
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"
)
Empfohlene Korrektur
In diesem Abschnitt erklären wir, wie Sie den path
-Parameter und die zusätzlichen ``-Optionen konfigurieren, damit sie in Snowpark funktionieren.
1. Pfad Parameter
Snowpark verlangt, dass der Parameter Pfad ein Stagingbereich ist. Als Problemumgehung können Sie einen temporären Stagingbereich erstellen und jede .orc
-Datei mit dem Präfix file://
zu diesem Stagingbereich hinzufügen.
2. Optionen Parameter
Snowpark erlaubt es nicht, die ****-Zusatzoptionen als Parameter der orc
-Funktion zu definieren. Als Problemumgehung können Sie für viele von ihnen die snowflake.snowpark.DataFrameReader.option-Funktion verwenden, um diese Parameter als Optionen von DataFrameReader anzugeben.
Bemerkung
Die folgenden Optionen werden von Snowpark nicht unterstützt:
Kompression
mergeSchema
Nachfolgend sehen Sie ein vollständiges Beispiel dafür, wie der Eingabecode nach Anwendung der oben genannten Vorschläge aussehen sollte, damit er in Snowpark funktioniert:
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)
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1038¶
Meldung: _ spark element _ wird noch nicht erkannt
Kategorie: Konvertierungsfehler
Beschreibung¶
Dieses Problem tritt auf, wenn es ein PySpark-Element in Ihrem Quellcode gibt, das von SMA nicht erkannt wurde. Dies kann verschiedene Gründe haben, wie zum Beispiel:
Ein Element, das in PySpark nicht existiert.
Ein Element, das in einer Version von PySpark hinzugefügt wurde, die von SMA noch nicht unterstützt wird.
Ein interner Fehler des SMA bei der Verarbeitung des Elements.
Dies ist ein allgemeiner Fehlercode, der von SMA für jedes nicht erkannte Element verwendet wird.
Szenario¶
Eingabe
Nachfolgend finden Sie ein Beispiel für die Verwendung einer Funktion, die von SMA nicht erkannt werden konnte, weil sie in PySpark nicht existiert.
from pyspark.sql import functions as F
F.unrecognized_function()
Ausgabe
Die SMA fügt dem Ausgabecode die EWI SPRKPY1038
hinzu, um Sie darauf hinzuweisen, dass dieses Element nicht erkannt werden konnte.
from snowflake.snowpark import functions as F
#EWI: SPRKPY1038 => pyspark.sql.functions.non_existent_function is not yet recognized
F.unrecognized_function()
Empfohlene Korrektur
Um zu versuchen, das Problem zu identifizieren, können Sie die folgenden Überprüfungen durchführen:
Prüfen Sie, ob das Element in PySpark existiert.
Prüfen Sie, ob das Element richtig geschrieben ist.
Prüfen Sie, ob Sie eine PySpark-Version verwenden, die von SMA unterstützt wird. Um zu erfahren, welche PySpark-Version von SMA zum Zeitpunkt der Ausführung von SMA unterstützt wird, können Sie die erste Seite der
DetailedReport. docx
-Datei einsehen.
Wenn es sich um ein gültiges PySpark-Element handelt, melden Sie bitte über die Option Problem melden der Website SMA, dass bei diesem Element ein Konvertierungsfehler aufgetreten ist, und fügen Sie alle zusätzlichen Informationen hinzu, die Sie für hilfreich halten.
Bitte beachten Sie, dass ein Element, das von SMA nicht erkannt werden konnte, nicht bedeutet, dass es von Snowpark nicht unterstützt wird. Sie sollten in der Snowpark-Dokumentation nachsehen, ob es ein äquivalentes Element gibt.
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.
SPRKPY1069¶
Meldung: Wenn der partitionBy-Parameter eine Liste ist, wird Snowpark einen Fehler ausgeben.
Kategorie: Warnung
Beschreibung¶
Bei der Verwendung der pyspark.sql.readwriter.DataFrameWriter.parquet-Methode, bei der es zum Parameter partitionBy
kommt, zeigt das Tool EWI an.
Das liegt daran, dass in Snowpark das DataFrameWriter.parquet nur ColumnOrSqlExpr
als partitionBy-Parameter unterstützt.
Szenarien¶
Szenario 1¶
Eingabecode:
In diesem Szenario ist der partitionBy-Parameter keine Liste.
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.write.parquet(file_path, partitionBy="age")
Ausgabecode:
Das Tool fügt die EWI SPRKPY1069
hinzu, um Sie darauf hinzuweisen, dass Snowpark einen Fehler auslöst, wenn der Parameter eine Liste ist.
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"))
Empfohlene Korrektur
Es gibt keine empfohlene Lösung für dieses Szenario, da das Tool diese EWI immer hinzufügt, nur für den Fall, dass der partitionBy-Parameter eine Liste ist. Denken Sie daran, dass in Snowpark nur Cloud-Speicherorte akzeptiert werden, die einen Snowflake-Stagingbereich verwenden.
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"))
Szenario 2¶
Eingabecode:
In diesem Szenario ist der partitionBy-Parameter eine Liste.
df = spark.createDataFrame([(25, "Alice", "150"), (30, "Bob", "350")], schema=["age", "name", "value"])
df.write.parquet(file_path, partitionBy=["age", "name"])
Ausgabecode:
Das Tool fügt die EWI SPRKPY1069
hinzu, um Sie darauf hinzuweisen, dass Snowpark einen Fehler auslöst, wenn der Parameter eine Liste ist.
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"))
Empfohlene Korrektur
Wenn der Wert des Parameters eine Liste
ist, dann ersetzen Sie ihn durch eine ColumnOrSqlExpr
.
df.write.parquet(file_path, partition_by = sql_expr("age || name"), format_type_options = dict(compression = "None"))
Zusätzliche Empfehlungen¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an sma-support@snowflake.com senden oder ein Problem im SMA melden.