如何使用 pandas 读取存储在 adls gen 2 中的文件?

问题描述 投票:0回答:3

我正在尝试通过 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 读取文件。

任何线索将不胜感激。

python python-3.x pandas apache-spark databricks
3个回答
1
投票

终于问题解决了,现在我可以使用pandas库读取adls中的数据了。无需火花或考拉转换。

pd.read_parquet("file_path", storage_options = "")

按照这篇文章进行存储选项。

https://learn.microsoft.com/en-us/azure/synapse-analytics/spark/tutorial-use-pandas-spark-pool


1
投票

Databricks 在 Spark 上发布了 pandas。 这取代了之前的考拉库。

https://spark.apache.org/docs/latest/api/python/user_guide/pandas_on_spark/index.html

搜索文档显示如何读取镶木地板文件。

https://spark.apache.org/docs/latest/api/python/reference/pyspark.pandas/api/pyspark.pandas.read_parquet.html

让我们假设所有事情都是平等的,使用 pandas 与 Spark 数据帧是否有更多的开销。 是的,我过去曾使用过这些库,当时我想使用的函数仅在 pandas 数据框中,而不是 pyspark sql 数据框中。

enter image description here

我有一些来自 Adventures 数据库 (SQL Server) 的现有 Parquet 文件,它们作为 Parquet 文件保存在数据湖中。

enter image description here

pandas 代码需要 0.84 秒返回。 我们可以看到类型是 pyspark.pandas.frame.Dataframe。

enter image description here

原生 Spark 代码需要 0.66 秒返回。 我们可以看到类型是 pyspark.sql.dataframe.Dataframe。

回顾一下,pandas 会更快的想法可能并不正确。 代码的设计几乎是一样的。 这些文件很小。 我想知道较大文件的时间安排是什么......


0
投票

使用

abfs
而不是
abfss
,它应该可以工作。

import pandas as pd 
pdf = pd.read_parquet("abfs://abc.parquet")
© www.soinside.com 2019 - 2024. All rights reserved.