【发布时间】:2019-05-05 22:39:41
【问题描述】:
我有一个 c# 应用程序,可以创建 parquet 文件并将其上传到远程 HDFS。如果我使用 scp 将文件复制到安装了 HDFS 客户端的目标计算机,然后将文件“hdfs put”到 HDFS 中,则 spark 可以正确读取文件。
如果我使用 curl 针对 webhdf 服务将文件从客户端应用程序直接上传到 HDFS,则在尝试读取 parquet 文件时从 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,paths))) 调用中的文件“/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 行,在 deco 引发 AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException:u'无法推断 Parquet 的架构。必须手动指定。;'
如果我将两个文件(scp 上传的一个和通过 curl 上传的文件)提取到本地文件系统并在文件之间进行二进制差异,则差异不会显示任何差异。如果我将文件再次放入 HDFS(使用 curl 和 webhdfs 上传的文件),那么 Spark 可以很好地读取 parquet 文件。
这就像“hdfs put”创造了某种魔法,让 spark 很好地读取 parquet 文件。
会发生什么?谢谢
更新:如果我到本地一个包含多个 parquet 的目录并再次将其放入 HDFS 中,它不起作用,我必须将 parquet 文件一个一个放入以使 spark 读取它们
【问题讨论】:
标签: scala apache-spark hdfs parquet webhdfs