Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark错误处理,文件名有空格_Python_Regex_Hadoop_Pyspark - Fatal编程技术网

Python Pyspark错误处理,文件名有空格

Python Pyspark错误处理,文件名有空格,python,regex,hadoop,pyspark,Python,Regex,Hadoop,Pyspark,我正在使用pyspark 2.1 问题陈述:需要验证hdfs路径,文件(如果存在)需要将文件名复制到变量中 以下是参考少数网站和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 =

我正在使用
pyspark 2.1

问题陈述:需要验证
hdfs路径
,文件(如果存在)需要将文件名复制到变量中

以下是参考少数网站和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'
当我试图在pyspark中导入上述详细代码时,我无法执行,因为文件名中存在空格。请帮助我解决这个问题。

问题 您的问题在这一行:

 hdfs_file_path = source_dir + '\'student marks details.csv\''
您正在添加两个不需要的单引号,并且忘记添加目录分隔符

路径在此命令中工作的原因:

hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'
因为这是一个shell命令。在您正在使用的shell上(可能是),以下命令是等效的:

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

子流程
调用只需要对应于所需值的普通字符串,不会像shell那样处理它们

解决方案 在python中,将路径连接在一起的最佳方式是调用。因此,我建议替换这些行:

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上),这样您就不会意外地忘记分隔符,或者添加两次。

如果您发现我的答案帮助您解决了问题,请继续接受它(或投票)。这就是我想要的。
source_dir = os.path.join('/user/dev/input/', today)
hdfs_file_path = os.path.join(source_dir, 'student marks details.csv')