我正在尝试通过 databricks 笔记本中的 pandas 读取镶木地板文件。集群有访问adls的权限。
import pandas as pd
pdf = pd.read_parquet("abfss://abc.parquet")
但是 pandas 无法读取它并抛出以下错误。
ValueError Traceback (most recent call last)
<command-2342282971496650> in <module>
1 import pandas as pd
2 parquet_file = 'abfss://abc.parquet'
----> 3 pd.read_parquet(parquet_file)
/databricks/python/lib/python3.8/site-packages/pandas/io/parquet.py in read_parquet(path, engine, columns, use_nullable_dtypes, **kwargs)
457 """
458 impl = get_engine(engine)
--> 459 return impl.read(
460 path, columns=columns, use_nullable_dtypes=use_nullable_dtypes, **kwargs
461 )
/databricks/python/lib/python3.8/site-packages/pandas/io/parquet.py in read(self, path, columns, use_nullable_dtypes, storage_options, **kwargs)
212 )
213
--> 214 path_or_handle, handles, kwargs["filesystem"] = _get_path_or_handle(
215 path,
216 kwargs.pop("filesystem", None),
/databricks/python/lib/python3.8/site-packages/pandas/io/parquet.py in _get_path_or_handle(path, fs, storage_options, mode, is_dir)
64 fsspec = import_optional_dependency("fsspec")
65
---> 66 fs, path_or_handle = fsspec.core.url_to_fs(
67 path_or_handle, **(storage_options or {})
68 )
/databricks/python/lib/python3.8/site-packages/fsspec/core.py in url_to_fs(url, **kwargs)
369 else:
370 protocol = split_protocol(url)[0]
--> 371 cls = get_filesystem_class(protocol)
372
373 options = cls._get_kwargs_from_urls(url)
/databricks/python/lib/python3.8/site-packages/fsspec/registry.py in get_filesystem_class(protocol)
206 if protocol not in registry:
207 if protocol not in known_implementations:
--> 208 raise ValueError("Protocol not known: %s" % protocol)
209 bit = known_implementations[protocol]
210 try:
ValueError: Protocol not known: abfss
我尝试了一种解决方法来做到这一点。
import pandas as pd
import pyspark.pandas as ps
pdf = ps.read_parquet("abfss://abc.parquet").to_pandas()
上述查询实际上需要花费大量时间将 pyspark.pandas 数据帧转换为 pandas 数据帧。
注意:我无法将 adls 挂载到 dbfs,因为 dbfs 已被平台团队禁用,因此所有操作都需要在 adls 上完成。
我正在寻找一种更快或更简单的方法来使用 python pandas 从 adls gen2 读取文件。
任何线索将不胜感激。
终于问题解决了,现在我可以使用pandas库读取adls中的数据了。无需火花或考拉转换。
pd.read_parquet("file_path", storage_options = "")
按照这篇文章进行存储选项。
https://learn.microsoft.com/en-us/azure/synapse-analytics/spark/tutorial-use-pandas-spark-pool
Databricks 在 Spark 上发布了 pandas。 这取代了之前的考拉库。
https://spark.apache.org/docs/latest/api/python/user_guide/pandas_on_spark/index.html
搜索文档显示如何读取镶木地板文件。
让我们假设所有事情都是平等的,使用 pandas 与 Spark 数据帧是否有更多的开销。 是的,我过去曾使用过这些库,当时我想使用的函数仅在 pandas 数据框中,而不是 pyspark sql 数据框中。
我有一些来自 Adventures 数据库 (SQL Server) 的现有 Parquet 文件,它们作为 Parquet 文件保存在数据湖中。
pandas 代码需要 0.84 秒返回。 我们可以看到类型是 pyspark.pandas.frame.Dataframe。
原生 Spark 代码需要 0.66 秒返回。 我们可以看到类型是 pyspark.sql.dataframe.Dataframe。
回顾一下,pandas 会更快的想法可能并不正确。 代码的设计几乎是一样的。 这些文件很小。 我想知道较大文件的时间安排是什么......
使用
abfs
而不是 abfss
,它应该可以工作。
import pandas as pd
pdf = pd.read_parquet("abfs://abc.parquet")