首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Paramiko连接SFTPFile作为输入传递给dask.dataframe.read_parquet

将Paramiko连接SFTPFile作为输入传递给dask.dataframe.read_parquet
EN

Stack Overflow用户
提问于 2019-06-24 19:13:27
回答 2查看 659关注 0票数 1

我尝试为pandas.read_parquet传递类paramiko.sftp_file.SFTPFile而不是文件URL,它工作得很好。但是当我用Dask尝试同样的方法时,它抛出了一个错误。下面是我试图运行的代码和我得到的错误。我怎么才能让它工作呢?

代码语言:javascript
运行
复制
import dask.dataframe as dd
import parmiko
ssh=paramiko.SSHClient()
sftp_client = ssh.open_sftp()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
source_file=sftp_client.open(str(parquet_file),'rb')
full_df = dd.read_parquet(source_file,engine='pyarrow')
print(len(full_df))
代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "C:\Users\rrrrr\Documents\jackets_dask.py", line 22, in <module>
    full_df = dd.read_parquet(source_file,engine='pyarrow')
  File "C:\Users\rrrrr\AppData\Local\Programs\Python\Python37\lib\site-packages\dask\dataframe\io\parquet.py", line 1173, in read_parquet
    storage_options=storage_options
  File "C:\Users\rrrrr\AppData\Local\Programs\Python\Python37\lib\site-packages\dask\bytes\core.py", line 368, in get_fs_token_paths
    raise TypeError('url type not understood: %s' % urlpath)
TypeError: url type not understood: <paramiko.sftp_file.SFTPFile object at 0x0000007712D9A208>
EN

回答 2

Stack Overflow用户

发布于 2019-06-24 20:06:36

Dask不直接支持类似文件的对象。

你将不得不实现他们的"file system" interface

我不确定允许read_parquet需要实现的最小方法集是什么。但是你一定要实现open。如下所示:

代码语言:javascript
运行
复制
class SftpFileSystem(object):
    def open(self, path, mode='rb', **kwargs):
        return sftp_client.open(path, mode)

dask.bytes.core._filesystems['sftp'] = SftpFileSystem

df = dd.read_parquet('sftp://remote/path/file', engine='pyarrow')

在fsspec库中实际上有这样的SFTP文件系统的实现:

https://filesystem-spec.readthedocs.io/en/latest/api.html#fsspec.implementations.sftp.SFTPFileSystem

另请参阅Is it possible to read a .csv from a remote server, using Paramiko and Dask's read_csv() method in conjunction?

强制警告:不要使用AutoAddPolicy -这样做会失去对的保护。有关正确的解决方案,请参阅。

票数 1
EN

Stack Overflow用户

发布于 2019-07-25 03:42:54

情况已经改变,您现在可以直接使用Dask完成此操作。来自Is it possible to read a .csv from a remote server, using Paramiko and Dask's read_csv() method in conjunction?的贴纸答案

在Dask的主版本中,文件系统操作现在使用fsspec,连同以前的实现(s3、gcs、hdfs)一起,现在支持一些额外的file-systems,请参阅到协议标识符fsspec.registry.known_implementations的映射。

简而言之,如果你从主机安装了fsspec和Dask,那么使用一个像‘s ftp://user:pw@host:port/path“这样的url就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56735362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档