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')