我有一个C#应用程序,可以创建镶木地板文件并将其上载到远程HDFS。如果我使用scp将文件复制到安装了HDFS客户端的目标计算机上,然后将文件“ hdfs”放入HDFS,spark可以正确读取文件。
如果我使用针对WebHDD服务的curl从客户端应用程序直接将文件上传到HDFS,尝试读取木地板文件时会从Spark中收到以下错误:
df = sqlContext.read.parquet(“ / tmp / test.parquet”) 追溯(最近一次通话): 文件“”,第1行,位于 实木复合地板中的文件“ /usr/hdp/current/spark2-client/python/pyspark/sql/readwriter.py”,第303行 返回self._df(self._jreader.parquet(_to_seq(self._spark._sc,路径))) 调用中的文件“ /usr/hdp/current/spark2-client/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,行1257 装饰中的文件“ /usr/hdp/current/spark2-client/python/pyspark/sql/utils.py”,第69行 引发AnalysisException(s.split(':',1)[1],stackTrace) pyspark.sql.utils.AnalysisException:u无法推断Parquet的架构。必须手动指定。'
如果我将两个文件(scp上传一个文件和通过curl上传的文件)都提取到本地文件系统,并在文件之间进行二进制比较,则该比较没有任何区别。如果将文件再次放入HDFS(使用curl和webhdfs上传的文件)中,那么Spark可以很好地读取镶木地板文件。
就像“ hdfs put”之类的东西,它使某种形式的魔术使火花能很好地读取镶木地板文件。
可能会发生什么?谢谢
更新:如果我进入一个包含多个实木复合地板的目录,然后再次将其放入HDFS中,它将无法正常工作,我必须将实木复合地板文件一个一个地放置,以使Spark读取它们
答案 0 :(得分:0)
您是否检查了webhdfs服务是否将文件放在相同的路径(/tmp/test.parquet)下?换句话说,您可以使用hdfs客户端(hdfs get)下载文件(已通过webhdfs上传)吗?
最佳, fej
答案 1 :(得分:0)
我终于找出了错误的原因。上传文件的名称以“ _”开头。这就是为什么spark无法加载镶木地板文件的原因。