使用具有空格的文件名进行Pyspark错误处理

时间:2017-08-20 09:45:26

标签: python regex hadoop pyspark

我正在使用pyspark 2.1

问题陈述:需要验证hdfs path,文件是否存在需要将文件名复制到变量中

以下是推荐几个网站和stackoverflow

后使用的代码
import os
import subprocess
import pandas as pd
import times
def run_cmd(args_list):
     print('Running system command: {0}'.format(' '.join(args_list)))
     proc = subprocess.Popen(args_list, stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
     proc.communicate()
     return proc.returncode

 today = datetime.now().date().strftime('%d%b%Y')
 source_dir = '/user/dev/input/'+ today
 hdfs_file_path=source_dir+'\'student marks details.csv\''
 cmd = ['hdfs', 'dfs', '-find','{}','-name', hdfs_file_path]
 code=run_cmd(cmd)
 if code<>1:
    print 'file doesnot exist'
    System.exit(1)
 else:
    print 'file exist'

使用上面的代码我收到错误,因为“文件不存在”但文件存在于该文件夹中

问题是能够在shell控制台中运行以下运行命令我正在获取完整路径。

hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'

当我尝试使用上面详细的代码导入pyspark时,我无法执行,因为文件名中存在空格。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

问题

你的问题就在这一行:

 hdfs_file_path = source_dir + '\'student marks details.csv\''

您正在添加两个不需要的单引号,并且忘记添加目录分隔符。

此命令中路径的工作原理:

hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'

是因为这是 shell 命令。在您正在使用的shell上(可能是bash),以下命令是等效的:

echo '/user/dev/input/08Aug2017/student marks details.csv'
echo /user/dev/input/08Aug2017/'student marks details.csv'

bash删除引号,并将字符串合并在一起,产生相同的字符串结果,即/user/dev/input/08Aug2017/student marks details.csv。引号实际上不是路径的一部分,而只是告诉bash不要在空格处拆分字符串,而是创建一个字符串,然后删除引号。

当你写:

 hdfs_file_path = source_dir + '\'student marks details.csv\''

您最终得到的路径是/user/dev/input/08Aug2017'student marks details.csv',而不是正确的/user/dev/input/08Aug2017/student marks details.csv

subprocess调用只需要与您想要的值对应的纯字符串,并且不会像shell那样处理它们。

解决方案

在python中,最好通过调用os.path.join来将路径连接在一起。所以我建议更换这些行:

source_dir = '/user/dev/input/' + today
hdfs_file_path = source_dir + '\'student marks details.csv\''

以下内容:

source_dir = os.path.join('/user/dev/input/', today)
hdfs_file_path = os.path.join(source_dir, 'student marks details.csv')

os.path.join注意在它的参数之间添加一个目录分隔符(在Unix上,/在Windows上),这样你就不会忘记分隔符,或者将它添加两次。