加载Parquet文件时无法推断架构

use*_*956 22 apache-spark parquet pyspark

response = "mi_or_chd_5"

outcome = sqlc.sql("""select eid,{response} as response
from outcomes
where {response} IS NOT NULL""".format(response=response))
outcome.write.parquet(response, mode="overwrite") # Success
print outcome.schema
StructType(List(StructField(eid,IntegerType,true),StructField(response,ShortType,true)))
Run Code Online (Sandbox Code Playgroud)

但是之后:

outcome2 = sqlc.read.parquet(response)  # fail
Run Code Online (Sandbox Code Playgroud)

失败了:

AnalysisException: u'Unable to infer schema for Parquet. It must be specified manually.;'
Run Code Online (Sandbox Code Playgroud)

/usr/local/lib/python2.7/dist-packages/pyspark-2.1.0+hadoop2.7-py2.7.egg/pyspark/sql/utils.pyc in deco(*a, **kw)
Run Code Online (Sandbox Code Playgroud)

镶木地板的文档说格式是自我描述的,并且在保存镶木地板文件时可以使用完整的模式.是什么赋予了?

使用Spark 2.1.1.在2.2.0中也失败了.

发现此错误报告,但已在2.0.1,2.1.0中修复.

更新:当与master ="local"连接时,此工作,当连接到master ="mysparkcluster"时失败.

Jav*_*tón 33

当您尝试将空目录读取为镶木地板时,通常会发生此错误.可能你的结果 Dataframe是空的.

outcome.rdd.isEmpty()在写入之前,您可以检查DataFrame是否为空.

  • 使用 isEmpty() 方法从来都不是一个好习惯。如果可以,请避免 - 它“可以”将整个数据带入驱动程序内存 - 参考 Spark 中的 RDD 类代码。 (2认同)

ost*_*ach 9

就我而言,发生错误是因为我试图读取以下划线开头的镶木地板文件(例如_lots_of_data.parquet)。不知道为什么这是一个问题,但删除前导下划线解决了这个问题。

也可以看看:

  • Spark 将所有以“_”开头的文件视为元数据而不是数据。 (4认同)
  • “Spark 2.0 忽略以下划线或点开头的路径名;`_` 或 `.`”,Spark 开发人员在此讨论:https://issues.apache.org/jira/browse/SPARK-16975?focusedCommentId=15415903&page= com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15415903 (2认同)

Ash*_*Ash 7

我正在使用 AWS Glue,并且在从数据目录表(位置:s3 存储桶)读取数据时收到此错误。经过一些分析,我意识到,这是由于文件位置(在我的情况下为 s3 存储桶路径)中的文件不可用。

Glue 试图在不存在的文件上应用数据目录表架构。

将文件复制到 s3 存储桶文件位置后,问题得到解决。

希望这对在 AWS Glue 中遇到/遇到错误的人有所帮助。

  • 另外,使用 AWS Glue 时,如果作业书签筛选器导致没有数据,而您尝试写入,则会显示“在最终作业书签筛选器之后,处理分区中 0 个文件的 0.00%”,然后导致“无法推断架构” Parquet。必须手动指定。” 因为正在写入的帧是空的。 (2认同)

小智 5

当您尝试读取空表时会发生这种情况。如果表中正确插入了数据,应该没有问题。

除了镶木地板,ORC 也会发生同样的事情。


iba*_*alf 5

只是为了在评论中强调@Davos 答案,如果您的文件名在文件名开头有一个点.或下划线,您将遇到这个确切的异常错误_

val df = spark.read.format("csv").option("delimiter", "|").option("header", "false")
         .load("/Users/myuser/_HEADER_0")

org.apache.spark.sql.AnalysisException: 
Unable to infer schema for CSV. It must be specified manually.;
Run Code Online (Sandbox Code Playgroud)

解决方案是重命名该文件并重试(例如_HEADER重命名为HEADER