pyspark中有没有一种方法可以将文件从远程位置快速复制到本地

pyspark中有没有一种方法可以将文件从远程位置快速复制到本地,pyspark,Pyspark,我正在使用mget参数使用lftp从远程位置复制文件。将50个xml文件从sftp机器复制到本地Unix机器大约需要2分钟。我希望能够复制20k个文件。XML文件约为15kb。dataframe df_文件包含我要复制的所有XML文件的列表 我用20000个文件尝试了下面的代码,似乎需要几个小时才能用这些文件创建一个数据帧 for row in df_files.tolist(): print row cmd_p1 = """lftp sftp://userna

我正在使用mget参数使用lftp从远程位置复制文件。将50个xml文件从sftp机器复制到本地Unix机器大约需要2分钟。我希望能够复制20k个文件。XML文件约为15kb。dataframe df_文件包含我要复制的所有XML文件的列表

我用20000个文件尝试了下面的代码,似乎需要几个小时才能用这些文件创建一个数据帧

 for row in df_files.tolist():
        print row
        cmd_p1 = """lftp sftp://username:password!@remotelocation-e "lcd /var/projects/u_admin/folder/;mget /var/projects/storage/folder/"""+row
        cmd_p2 = """;bye " """
        cmd_get_xml = cmd_p1+cmd_p2
        s=subprocess.call(cmd_get_xml,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

j=0
    for row in df_file.itertuples(index=True, name='Pandas'):
            print getattr(row,'filename') 
            if j==0:
                acq = sqlContext.read.format("com.databricks.spark.xml").option("rowTag","Message").load("file:///var/projects/u_admin/folder/"+df_file['filename'].iloc[j])
                schema = acq.schema
            else : 
                acq2 = sqlContext.read.format("com.databricks.spark.xml").option("rowTag","Message").load("file:///var/projects/u_admin/folder/"+df_file['filename'].iloc[j], schema = schema)
                acq = acq.union(acq2)

我希望能够以最少的时间复制这些文件。

首先,使用将所有
.xml
文件复制到一个目录中。假设
.xml
文件具有相同的架构,因为您可以在同一个目录上执行
联合
,一旦所有这些xml文件都位于一个目录中,您就可以直接读取整个目录,而不是单独读取文件

此解决方案将节省您在for循环中花费的大量时间

import paramiko
from scp import SCPClient

def createSSHClient(server, port, user, password):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(server, port, user, password)
    return client

ssh = createSSHClient(server, port, user, password)
scp = SCPClient(ssh.get_transport())
然后调用
scp.get()
scp.put()
执行scp操作

acq_all = sqlContext.read.format("com.databricks.spark.xml").option("rowTag","Message").load("file:///var/projects/u_admin/folder/", schema = schema)
我理解您的用例可能有点不同,因为您也有一个
if-else
块,但是模式是相同的,所以可以在读取文件后执行。 您可以读取一个文件,以获得正确的模式,也可以在读取之前自己定义它