pyspark 有效的 parquet 文件,但 parquet 架构错误

yjghlzjz  于 2023-04-19  发布在  Spark
关注(0)|答案(2)|浏览(275)

我有正确的 parquet 文件(我是100%肯定),只有一个文件在这个目录v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/ .我得到了这个一般错误AnalysisException: Unable to infer schema ...在读操作,看到完整的错误细节:

---------------------------------------------------------------------------
AnalysisException                         Traceback (most recent call last)
<ipython-input-26-5beebfd65378> in <module>
      1 #error
----> 2 new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/")
      3 new_DF.show()
      4 
      5 spark.close()

/spark/python/pyspark/sql/readwriter.py in parquet(self, *paths, **options)
    299                        int96RebaseMode=int96RebaseMode)
    300 
--> 301         return self._df(self._jreader.parquet(_to_seq(self._spark._sc, paths)))
    302 
    303     def text(self, paths, wholetext=False, lineSep=None, pathGlobFilter=None,

/spark/python/lib/py4j-0.10.9.3-src.zip/py4j/java_gateway.py in __call__(self, *args)
   1320         answer = self.gateway_client.send_command(command)
   1321         return_value = get_return_value(
-> 1322             answer, self.gateway_client, self.target_id, self.name)
   1323 
   1324         for temp_arg in temp_args:

/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
    115                 # Hide where the exception came from that shows a non-Pythonic
    116                 # JVM exception message.
--> 117                 raise converted from None
    118             else:
    119                 raise

AnalysisException: Unable to infer schema for Parquet. It must be specified manually.

我使用了这个代码:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/")
new_DF.show()

奇怪的是,它工作正常,当我使用完整路径的Parquet文件:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/")
new_DF.show()

你有类似的问题吗?

cx6n0qe3

cx6n0qe31#

发生错误的原因是 parquet 文件不在"v3io://projects/risk/FeatureStore/ptp/parquet/"文件夹中,而是在"v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/"文件夹中。
这将工作:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/*/*/*")
new_DF.show()

*语法读取目录中的所有内容。
有关使用spark.read大量阅读文件的更多信息,请参阅此问题:Regex表示开始日期和结束日期之间的日期

xqnpmsa8

xqnpmsa82#

通常情况下,你在阅读一个parquet时不会看到这个错误,因为模式已经在parquet文件中了,根据我的经验,这里有一些你看到这个错误的原因:
1.您尝试读取的Parquet是空的,由于某些奇怪的原因,当Parquet是空的时,spark抛出此错误,但这似乎不是问题,因为您在“v3 io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/”下有一个Parquet文件
1.例如,在您尝试读取的路径下可能有具有不同架构的 parquet 文件

/path/
     partition=value1/
         part-000...snappy.parquet
     partition=value2/
         part-000...snappy.parquet

如果两个parquets没有相同的模式,你会得到这个错误。
1.在所有子目录的路径“v3 io://projects/risk/FeatureStore/ptp/parquet/”下,您可能有非parquet文件。
尽管问题可以在上面列出,但它可能是另一个问题,因为没有关于“v3 io://projects/risk/FeatureStore/ptp/parquet/”下文件的足够信息,我建议您将该路径下的整个树沿着所有parquet文件的模式添加到您的帖子中。

更新

仔细观察你的路径,我看到了问题,这条路径

sets/ptp/1681296898546_70

应该是这样的

Patition1=sets/Patition2=ptp/Patition3=1681296898546_70

在spark中,您可以直接指向您的parquet或分区目录,但不能指向既不是parquet内容也不是分区的路径。

相关问题