今天我开始使用 Dask 和 Paramiko 软件包,部分是作为学习练习,部分是因为我正在开始一个需要处理大型数据集的项目( 10 GB),只能从远程虚拟机访问(即无法在本地存储)。
以下代码属于一个简短的帮助程序,它将为虚拟机上托管的大型 csv 文件创建 dask 数据帧。我想稍后将其输出(引用 dask 数据帧)传递给第二个函数,该函数将对其执行一些概述分析。
import dask.dataframe as dd
import paramiko as pm
import pandas as pd
import sys
def remote_file_to_dask_dataframe(remote_path):
if isinstance(remote_path, (str)):
try:
client = pm.SSHClient()
client.load_system_host_keys()
client.connect('#myserver', username='my_username', password='my_password')
sftp_client = client.open_sftp()
remote_file = sftp_client.open(remote_path)
df = dd.read_csv(remote_file)
remote_file.close()
sftp_client.close()
return df
except:
print("An error occurred.")
sftp_client.close()
remote_file.close()
else:
raise ValueError("Path to remote file as string required")
代码既不漂亮也不完整,我会及时用 ssh key 替换用户名和密码,但这不是问题。在 jupyter 笔记本中,我之前使用服务器上文件的路径打开了 sftp 连接,并使用常规 Pandas read_csv 调用将其读入数据帧。但是,这里使用 Dask 的等效行是问题的根源:df = dd.read_csv(remote_file)
。
我已经查看了在线文档( here ),但我无法判断我上面尝试的是否可行。看来对于网络选项,Dask 需要一个 url。参数传递选项,例如S3 似乎依赖于该基础设施的后端。不幸的是,我无法理解 dash-ssh 文档 ( here )。
我已经研究过 print 语句,唯一无法执行的行就是所述的那一行。出现的错误是:raise TypeError('url type not recognize: %s' % urlpath) 类型错误:无法理解 url 类型:
任何人都可以为我指明实现我想要做的事情的正确方向吗?我希望 Dask 的 read_csv
能够像 Pandas 一样发挥作用,因为它基于相同的功能。
非常感谢任何帮助,谢谢。
附:我知道 Pandas 的 read_csv
chunksize 选项,但如果可能的话,我想通过 Dask 实现此目的。
最佳答案
在 Dask 的主版本中,文件系统操作现在使用 fsspec
,它与之前的实现(s3、gcs、hdfs)一起现在支持一些额外的 file-systems ,请参阅协议(protocol)标识符 fsspec.registry.known_implementations
的映射.
简而言之,如果您从 master 安装 fsspec 和 Dask,那么使用“sftp://user:pw@host:port/path”这样的 URL 现在应该适合您。
关于python - 是否可以结合使用 Paramiko 和 Dask 的 read_csv() 方法从远程服务器读取 .csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623297/