如何在PySpark中调用org.apache.hadoop.fs.FileUtil.copy()?
PySpark调用Hadoop FileUtil方法失败问题
问题概述
在PySpark脚本中执行HDFS文件操作时,前两项功能正常,仅使用org.apache.hadoop.fs.FileUtil进行文件移动等操作失败:
- 路径/文件存在性检查(
org.apache.hadoop.fs.FileSystem)——正常 - 创建/删除文件夹(
org.apache.hadoop.fs.FileSystem)——正常 - 路径间文件移动(
org.apache.hadoop.fs.FileUtil)——失败,原因未知
已实现代码
获取JVM对象代码
# 获取所有JVM对象 spark = SparkSession.builder.getOrCreate() hadoopPath = spark._jvm.org.apache.hadoop.fs.Path hadoopConfiguration = spark._jsc.hadoopConfiguration() hadoopFs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(hadoopConfiguration) # 导入FileUtil未报错 hadoopFu = spark._jvm.org.apache.hadoop.fs.FileUtil
正常运行的FileSystem操作
path1="hdfs://mycluster/somefolder" path2="hdfs://mycluster/newfolder" # 检查文件夹是否存在及是否包含parquet文件(返回文件列表或空列表) hadoopFs.globStatus(hadoopPath(path + "/*.parquet")) # 仅检查路径是否存在(返回布尔值) hadoopFs.exists(hadoopPath(path)) # 在HDFS上创建文件夹 hadoopFs.mkdirs(hadoopPath(path2))
错误详情
尝试调用FileUtil的方法时,提示方法不存在,这些方法属于标准Hadoop/Spark库,但执行失败:
调用list方法报错
执行代码:
hadoopFu.list(path1)
报错信息:
Py4JError: An error occurred while calling z:org.apache.hadoop.fs.FileUtil.list. Trace: py4j.Py4JException: Method list([class java.lang.String]) does not exist
调用copy方法报错
执行代码:
hadoopFu.copy(path1,path2)
报错信息:
Py4JError: An error occurred while calling z:org.apache.hadoop.fs.FileUtil.copy. Trace: py4j.Py4JException: Method copy([class java.lang.String, class java.lang.String]) does not exist
疑问
为何找不到这些方法?操作哪里出错了?需要在Python/PySpark封装内完成该操作。
内容的提问来源于stack exchange,提问作者Alex Ortner
相关产品推荐
相关产品推荐

