Spark:无法从HDFS加载实木复合地板文件,直到将其“放入” HDFS

时间:2018-12-04 13:26:32

标签: scala apache-spark hdfs parquet webhdfs

我有一个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读取它们

2 个答案:

答案 0 :(得分:0)

您是否检查了webhdfs服务是否将文件放在相同的路径(/tmp/test.parquet)下?换句话说,您可以使用hdfs客户端(hdfs get)下载文件(已通过webhdfs上传)吗?

最佳, fej

答案 1 :(得分:0)

我终于找出了错误的原因。上传文件的名称以“ _”开头。这就是为什么spark无法加载镶木地板文件的原因。