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.
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
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") ' –
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