2017-07-06 2 views
2
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))) 

Laden Aber dann:Unable Schema zu schließen, wenn Parquet Datei

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

nicht mit:

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

in

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

Die Dokumentation für Parkett sagt das Format selbstbeschreibend, und das vollständige Schema war verfügbar, wenn t Die Parkettdatei wurde gespeichert. Was gibt?

Verwenden von Spark 2.1.1. Scheitert auch in 2.2.0.

this bug report gefunden, wurde aber in 2.0.1, 2.1.0 behoben.

UPDATE: Dies funktioniert, wenn auf mit master = "local" verbunden ist, und schlägt fehl, wenn master = "mysparkcluster" verbunden ist.

Antwort

2

Dieser Fehler tritt normalerweise auf, wenn Sie versuchen, ein leeres Verzeichnis als Parkett zu lesen. Wahrscheinlich Ihr ErgebnisDatenrahmen ist leer.

Sie können prüfen, ob der DataFrame mit outcome.rdd.isEmpty() leer ist, bevor Sie es schreiben.

+0

Der Datenrahmen ist nicht leer. Ich glaube, das Problem tritt auf, weil der Dateiname 'response' nicht in den Cluster geschrieben werden kann. Funktioniert im lokalen Modus. – user48956

+0

Dann könnten Sie vielleicht versuchen, den Benutzernamen zu ändern. In Pyspark: 'os.environ [" HADOOP_USER_NAME "] =" hdfs "' oder in Scala'System.setProperty ("HADOOP_USER_NAME", "hdfs") ' –

+0

Ich bin mir nicht sicher, ob wir Hadoop nutzen. Ist dies eine Voraussetzung für Spark und muss bei der Installation des Spark-Clusters mit Benutzerprofilen konfiguriert werden? (Alle unsere Daten stammen aus relationalen DBs und werden bei Bedarf in Spark geladen). In jedem Fall muss ich den Dateinamen nicht mit "hdfs: //" voranstellen. Wenn Sie einen Dateinamen wie "/ my/nfs/network_directory/filename" speichern, funktioniert dies. Das lässt mich auch denken, dass der Pfad sich auf das Worker-Local-Dateisystem bezieht. (Entschuldigung - Funke n00b) – user48956

0

Dieser Fall tritt auf, wenn Sie versuchen, eine Tabelle zu lesen, die leer ist. Wenn die Tabelle Daten korrekt eingefügt hat, sollte kein Problem auftreten.

Abgesehen davon mit Parkett passiert das gleiche mit ORC.