2016-08-03 26 views
5

Ich bin eine Hive Tabelle mit Spark-SQL zu lesen und es zu einem scala valaus einem Bienenstock Tabelle lesen und schreiben zurück, um es Funken sql

val x = sqlContext.sql("select * from some_table") 

Dann mach eine Verarbeitung mit dem Datenrahmen x I zuweisen und Schließlich kommt ein Datenrahmen y auf, der das genaue Schema wie die Tabelle some_table hat.

Schließlich versuche ich, die y-Datenrahmen auf den gleichen hive Tisch

some_table

y.write.mode(SaveMode.Overwrite).saveAsTable().insertInto("some_table") 
einzufügen überschreiben Dann

org.apache.spark.sql.AnalysisException den Fehler Ich erhalte: nicht kann einfügen Überschreiben in die Tabelle, die auch von

gelesen wird ich habe versucht, ein Insert sQL-Anweisung Erstellen und Brennen es sqlContext.sql mit () Aber es gab mir auch den gleichen Fehler.

Gibt es eine Möglichkeit, diesen Fehler zu umgehen? Ich muss die Datensätze wieder in die gleiche Tabelle einfügen.


Hallo Ich habe versucht, wie vorgeschlagen, aber immer noch den gleichen Fehler.

val x = sqlContext.sql("select * from incremental.test2") 
val y = x.limit(5) 
y.registerTempTable("temp_table") 
val dy = sqlContext.table("temp_table") 
dy.write.mode("overwrite").insertInto("incremental.test2") 

scala> dy.write.mode("overwrite").insertInto("incremental.test2") 
      org.apache.spark.sql.AnalysisException: Cannot insert overwrite into table that is also being read from.; 

Antwort

5

Sie sollten zunächst Ihre Datenrahmen y in einer temporären Tabelle

y.write.mode("overwrite").saveAsTable("temp_table") 

Dann speichern Sie Zeilen in der Zieltabelle wieder

val dy = sqlContext.table("temp_table") 
dy.write.mode("overwrite").insertInto("some_table") 
+0

Haben Sie den gleichen Fehler überschreiben können. Bearbeitet meine Frage mit dem Code-Snippet – Avi

+0

Sorry, ich habe meine Antwort bearbeitet. registerAsTempTable erstellt eine In-Memory-Tabelle und gibt damit den gleichen Fehler. Mit saveAsTable sollte es funktionieren (aber es wird dann auf die Festplatte geschrieben, Sie müssen die Tabelle danach löschen). Sorry, ich sehe keine anderen Alternativen – cheseaux

+0

Ya, ich habe die Situation mit der gleichen Logik behandelt, aber ich fühle es nicht kosteneffizient. Der Punkt, den du markiert hast, auf die Festplatte schreibend, ist der Teil, den ich gerne überspringen würde. Anyways danke für deine Hilfe @ Cheseaux. Lass es mich wissen, wenn du etwas Gutes dabei findest. Prost!! – Avi