我正在使用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时,我无法执行,因为文件名中存在空格。请帮我解决这个问题。
答案 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上),这样你就不会忘记分隔符,或者将它添加两次。