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)))
Mais alors:
outcome2 = sqlc.read.parquet(response) # fail
échoue avec:
AnalysisException: u'Unable to infer schema for Parquet. It must be specified manually.;'
dans
/usr/local/lib/python2.7/dist-packages/pyspark-2.1.0+hadoop2.7-py2.7.Egg/pyspark/sql/utils.pyc in deco(*a, **kw)
La documentation de parquet indique que le format est auto-descriptif et que le schéma complet était disponible lors de la sauvegarde du fichier de parquet. Ce qui donne?
Utilisation de Spark 2.1.1. Échec aussi en 2.2.0.
Trouvé ce rapport de bogue , mais a été corrigé dans 2.0.1, 2.1.0.
UPDATE: Cela fonctionne lorsque connecté avec master = "local" et échoue lors de la connexion à master = "mysparkcluster".
Cette erreur se produit généralement lorsque vous essayez de lire un répertoire vide comme parquet . Votre result Dataframe est probablement vide.
Vous pouvez vérifier si le DataFrame est vide avec outcome.rdd.isEmpty()
avant de l'écrire.
Dans mon cas, l'erreur est survenue parce que j'essayais de lire un fichier de parquet qui commençait par un trait de soulignement (par exemple, _lots_of_data.parquet
). Je ne sais pas pourquoi il s’agissait d’un problème, mais la suppression du trait de soulignement principal a résolu le problème.
Voir également:
Ce cas se produit lorsque vous essayez de lire une table vide. Si la table avait correctement inséré les données, il ne devrait y avoir aucun problème.
Outre le parquet, il en va de même pour ORC.
J'utilise AWS Glue et j'ai reçu cette erreur lors de la lecture des données à partir d'une table de catalogue de données (emplacement: compartiment s3). Après un peu d’analyse, j’ai réalisé que cela était dû au fait que le fichier n’était pas disponible à l’emplacement du fichier (dans mon cas, le chemin du compartiment s3).
Glue essayait d'appliquer un schéma de table de catalogue de données à un fichier qui n'existe pas.
Après avoir copié le fichier à l’emplacement du fichier de compartiment s3, le problème a été résolu.
J'espère que cela aidera quelqu'un qui rencontre/a rencontré une erreur dans AWS Glue.
J'ai rencontré un problème similaire avec la lecture d'un CSV
spark.read.csv("s3a://bucket/spark/csv_dir/.")
a donné une erreur de:
org.Apache.spark.sql.AnalysisException: Unable to infer schema for CSV. It must be specified manually.;
J'ai trouvé si j'ai enlevé le .
final, puis ça marche. c'est à dire:
spark.read.csv("s3a://bucket/spark/csv_dir/")
J'ai testé ceci pour parquet
en ajoutant un .
final et vous obtenez une erreur de:
org.Apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
Dans mon cas, l'erreur est survenue car le nom du fichier contenait des caractères de soulignement. Réécrire/lire le fichier sans trait de soulignement (les tirets étaient OK) a résolu le problème ...