Ausgabe
Ich versuche, das Paket pandas_profiling zu verwenden, um einige Datenrahmen aus Apaceh Zeppelin automatisch zu beschreiben.
Der Code, den ich ausführe, ist:
%pyspark
import sys
print(sys.version_info)
import numpy as np
print("numpy: ", np.__version__)
import pandas as pd
print("pandas: ", pd.__version__)
import pandas_profiling as pp
print("pandas_profiling: ", pp.__version__)
from pandas_profiling import ProfileReport
df = spark.sql("SELECT * FROM database.table")
profile = ProfileReport(df, title="Report: table")
profile.to_widgets()
Mein Ergebnis ist:
sys.version_info(major=3, minor=6, micro=8, releaselevel='final', serial=0)
numpy: 1.19.5
pandas: 1.1.5
pandas_profiling: 3.1.0
Fail to execute line 19: profile.to_widgets()
Traceback (most recent call last):
File "/tmp/1662648724242-0/zeppelin_python.py", line 158, in <module>
exec(code, _zcUserQueryNameSpace)
File "<stdin>", line 19, in <module>
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 414, in to_widgets
display(self.widgets)
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 197, in widgets
self._widgets = self._render_widgets()
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 315, in _render_widgets
report = self.report
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 179, in report
self._report = get_report_structure(self.config, self.description_set)
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/profile_report.py", line 166, in description_set
self._sample,
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/model/describe.py", line 56, in describe
check_dataframe(df)
File "/usr/local/lib/python3.6/site-packages/multimethod/__init__.py", line 209, in __call__
return self[tuple(map(self.get_type, args))](*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/pandas_profiling/model/dataframe.py", line 10, in check_dataframe
raise NotImplementedError()
NotImplementedError
Gibt es eine Möglichkeit, dies zu umgehen? Irgendeine Hoffnung, es von Zeppelin aus zu umgehen?
Lösung
Die NotImplementedError
wird erhoben von check_dataframe
: https://github.com/ydataai/pandas-profiling/blob/v3.1.0/src/pandas_profiling/model/dataframe.py#L10 . check_dataframe
verwendet Multimethod , um das Senden mehrerer Argumente an Funktionen zu ermöglichen, die derzeit nur Pandas DataFrames unterstützen: https://github.com/ydataai/pandas-profiling/blob/v3.1.0/src/pandas_profiling/model/pandas/dataframe_pandas.py#L11 . Im Code-Snippet stellen Sie einen Spark-Datenrahmen (das Ergebnis von spark.sql(...)
) bereit, für den es anscheinend keine registrierte Funktion für den dynamischen Versand gibt. Wenn Sie den Spark-Datenrahmen mithilfe der toPandas
Methode in einen Pandas-Datenrahmen konvertieren, sollte er die richtige check_dataframe
Funktion aufrufen:
%pyspark
import sys
print(sys.version_info)
import numpy as np
print("numpy: ", np.__version__)
import pandas as pd
print("pandas: ", pd.__version__)
import pandas_profiling as pp
print("pandas_profiling: ", pp.__version__)
from pandas_profiling import ProfileReport
df = spark.sql("SELECT * FROM database.table").toPandas()
profile = ProfileReport(df, title="Report: table")
profile.to_widgets()
Alternativ können Sie versuchen, Ihre eigene Funktion zum Überprüfen von Spark-Datenrahmen zu registrieren, dh;
from pandas_profiling.model.dataframe import check_dataframe
from pyspark.sql import DataFrame as SparkDataFrame
@check_dataframe.register
def spark_check_dataframe(df: SparkDataFrame):
# do something here or just make it a `pass`
aber nachgelagerte Funktionen in der Berichtslogik sind möglicherweise nicht mit Spark-Datenrahmen kompatibel (und sind es wahrscheinlich nicht).
Eine weitere Alternative, wenn Sie aufgrund des Umfangs der Daten oder des Komforts mit der API weiterhin mit Spark-Datenrahmen arbeiten möchten, ist spark-df-profiling , das auf Pandas-Profilerstellung basiert, aber für die Handhabung von Spark-Datenrahmen entwickelt wurde.
Beantwortet von – danielcahall
Antwort geprüft von – Clifford M. (FixError Volunteer)