我尝试为pandas.read_parquet
传递类paramiko.sftp_file.SFTPFile
而不是文件URL,它工作得很好。但是当我用Dask尝试同样的方法时,它抛出了一个错误。下面是我试图运行的代码和我得到的错误。我怎么才能让它工作呢?
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))
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>
发布于 2019-06-24 20:06:36
Dask不直接支持类似文件的对象。
你将不得不实现他们的"file system" interface。
我不确定允许read_parquet
需要实现的最小方法集是什么。但是你一定要实现open
。如下所示:
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
强制警告:不要使用AutoAddPolicy
-这样做会失去对的保护。有关正确的解决方案,请参阅。
发布于 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就可以了。
https://stackoverflow.com/questions/56735362
复制相似问题