pyspark文件名有空格的错误处理

ktca8awb  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(446)

我正在使用 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控制台中运行runbelow命令我正在获取完整的路径。

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

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

5q4ezhmt1#

问题

你的问题在这条线上:

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

相关问题