---
title: （24.0.RC1已下线）基于ORC社区发布的Release版本，partition字段为特殊字符会导致HDFS URL解析错误的解决方法
description: "执行OmniOperator作业的时候，如果ORC/Parquet格式的Hive数据集设置了partition字段，并且partition字段为string、char或者varchar类型，其中内容包含1个或多个特殊字符，例如!#$%&()*+,-./:;<=>?@[\]^_`{|}~等，作业会执行失败，有如下错误日志，并且作业没有执行结果。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/bds/kunpengbds_omniruntime_20_0173.html
sourcePath: /source/zh/kunpengboostkithistory/2300/bds/kunpengbds_omniruntime_20_0173.html
indexId: 1b7b1a3558bf69835199da30694e3a6758b8f036c73409ab496690d876504e4578
---
# （24.0.RC1已下线）基于ORC社区发布的Release版本，partition字段为特殊字符会导致HDFS URL解析错误的解决方法

#### 问题现象描述

执行OmniOperator作业的时候，如果ORC/Parquet格式的Hive数据集设置了partition字段，并且partition字段为string、char或者varchar类型，其中内容包含1个或多个特殊字符，例如!#$%&()*+,-./:;<=>?@[\]^_`{|}~等，作业会执行失败，有如下错误日志，并且作业没有执行结果。

错误日志1：文件不存在

```
ERROR Executor: Exception in task 0.0 in stage 0.0 （TID 0）
org.apache.spark.util.TaskCompletionListenerException: delete nullptr error for reader

Previous exception in task: Can't open/user/hive/warehouse/tpcds_bin_ partitioned_decimal_orc_2.db/partition_null_varchar/c_varchar=7893456=bbb/000000_0. status code: 2, message: File does not exist: /user/hive/warehouse/tpcds_bin_partitioned_decimal_orc_2.db/partition_null_varchar/c_varchar=7893456=bbb/000000_0
```

错误日志2：ORC格式下HDFS URL格式错误

```
ERROR Executor: Exception in task 0.0 in stage 0.0 （TID 0）
org.apache.spark.util.TaskCompletionListenerException: delete nullptr error for reader

Previous exception in task: Malformed URL: hdfs: //server1:9000/user/hive/warehouse/tpcds_bin_partitioned_decimal_orc_2.db/partition_null_varchar/c_varchar=3333|bbb/000000_0
```


错误日志3：Parquet格式下HDFS URL格式错误

```
Previous exception in task: IOError: Invalid: Cannot parse URI: 'hdfs://server1:9000/user/hive/warehouse/mytest.db/partition_null_varchar/c_varchar=1233456|/000000_0'
/home/code/arrow/cpp/src/arrow/filesystem/filesystem.cc:750  ParseFileSystemUri(uri_string)
	com.huawei.boostkit.spark.jni.ParquetColumnarBatchJniReader.initializeReader(Native Method)
```

#### 关键过程、根本原因分析

这是开源ORC/Arrow组件依赖的第三方库uriparser的一个BUG(https://issues.apache.org/jira/browse/ORC-1500)。

- Spark引擎侧传入Native ORC的HDFS URL被ORC的OrcHdfsFile.cc进行多余转义，接着利用HDFS C++客户端libhdfspp向服务端请求后，HDFS服务端返回文件不存在。
- Native ORC使用了HDFS C++客户端libhdfspp，而后者利用第三方依赖uriparser2进行URL解析，如果URL包含特殊字符，例如|,{,},[,],<,>,'等，会解析失败导致返回HDFS URL格式异常。
- 同样的，Arrow也依赖了uriparser解析URL，因此Native Parquet也不支持特殊字符，会解析失败导致返回HDFS URL格式异常。


#### 结论、解决方案及效果

- ORC格式下，使用本版本提供的liborc.so可以规避该问题，或使用社区的Patch重新编译liborc.so，链接如下，  https://github.com/apache/orc/pull/1609(https://github.com/apache/orc/pull/1609)
。
- Parquet格式下，使用本版本提供的libarrow.so可以规避该问题，或使用社区的Patch重新编译libarrow.so，链接如下，  https://github.com/apache/arrow/pull/37490(https://github.com/apache/arrow/pull/37490)
。
