web-dev-qa-db-ja.com

Parquetファイルを読み込むときにスキーマを推測できません

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)))

しかしその後:

outcome2 = sqlc.read.parquet(response)  # fail

失敗します:

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

/usr/local/lib/python2.7/dist-packages/pyspark-2.1.0+hadoop2.7-py2.7.Egg/pyspark/sql/utils.pyc in deco(*a, **kw)

寄木細工のドキュメントには、形式が自己記述的であり、寄木細工のファイルが保存されたときに完全なスキーマが利用可能であったと書かれています。何が得られますか?

Sparkの使用2.1.1。 2.2.0でも失敗します。

このバグレポート が見つかりましたが、2.0.1、2.1.0で修正されました。

更新:これは、master = "local"で接続されている場合に機能し、master = "mysparkcluster"に接続されている場合は失敗します。

21
user48956

このエラーは通常、空のディレクトリを寄木細工として読み取ろうとしたときに発生します。おそらくoutcomeDataframeは空です。

書き込む前に、outcome.rdd.isEmpty()でDataFrameが空かどうかを確認できます。

30
Javier Montón

私の場合、アンダースコアで始まる寄木細工のファイル(たとえば_lots_of_data.parquet)を読み取ろうとしたため、エラーが発生しました。これがなぜ問題なのかはわかりませんが、先頭のアンダースコアを削除することで問題は解決しました。

以下も参照してください:

3
ostrokach

このケースは、空のテーブルを読み取ろうとしたときに発生します。テーブルにデータが正しく挿入されていれば、問題はないはずです。

寄木細工のそれ以外に、ORCでも同じことが起こります。

3
Anxo P

AWS Glueを使用していますが、データカタログテーブル(場所:s3バケット)からデータを読み取り中にこのエラーを受け取りました。少し分析した結果、これはファイルの場所(私の場合はs3バケットパス)で使用できないファイルが原因であることがわかりました。

Glueは、存在しないファイルにデータカタログテーブルスキーマを適用しようとしました。

ファイルをs3バケットファイルの場所にコピーした後、問題は解決しました。

これがAWS Glueでエラーに遭遇/遭遇した人の助けになることを願っています。

3
Ash

私の場合、ファイル名にアンダースコアが含まれていたため、エラーが発生しました。アンダースコアなしのファイルの書き換え/読み取り(ハイフンは問題ありませんでした)は、問題を解決しました...

2
meeh

私はcsvを読んで同様の問題に遭遇しました

spark.read.csv("s3a://bucket/spark/csv_dir/.")

エラーが発生しました:

org.Apache.spark.sql.AnalysisException: Unable to infer schema for CSV. It must be specified manually.;

末尾の.を削除して、それが機能するかどうかを確認しました。すなわち:

spark.read.csv("s3a://bucket/spark/csv_dir/")

parquetの末尾に.を追加してこれをテストしましたが、次のエラーが表示されます:

org.Apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
1
lockwobr

すでに非常に多くの回答があります。しかし、私が直面した問題は、Sparkジョブが、以前に開始された別のSparkジョブによって上書きされているファイルを読み取ろうとしていたことでした。悪いように聞こえますが、私はその間違いをしました。

1
Pavan_Obj