Saltar al contenido

¿Cuáles son las diferencias entre saveAsTable e insertInto en diferentes SaveMode (s)?

Solución:

DESCARGO DE RESPONSABILIDAD He estado explorando insertInto durante algún tiempo y aunque estoy lejos de ser un experto en esta área, estoy compartiendo los hallazgos para un bien mayor.

Lo hace insertInto ¿Siempre esperas que la mesa exista?

Sí (según el nombre de la tabla y la base de datos).

Además, no se pueden insertar todas las tablas, es decir, una tabla (permanente), una vista temporal o una vista global temporal están bien, pero no:

  1. una mesa en cubos

  2. una tabla basada en RDD

¿Los SaveModes tienen algún impacto en insertInto?

(¡Esa también ha sido mi pregunta recientemente!)

Sí, pero solo SaveMode.Overwrite. Después de pensar en insertInto los otros 3 modos de guardado no tienen mucho sentido (ya que simplemente inserta un conjunto de datos).

¿Cuáles son las diferencias entre saveAsTable con SaveMode.Append e insertInto dado que la tabla ya existe?

¡Esa es una muy buena pregunta! Yo diría que ninguno, pero veamos con un solo ejemplo (esperando que eso demuestre alguna cosa).

scala> spark.version
res13: String = 2.4.0-SNAPSHOT

sql("create table my_table (id long)")
scala> spark.range(3).write.mode("append").saveAsTable("my_table")
org.apache.spark.sql.AnalysisException: The format of the existing table default.my_table is `HiveFileFormat`. It doesn't match the specified format `ParquetFileFormat`.;
  at org.apache.spark.sql.execution.datasources.PreprocessTableCreation$$anonfun$apply$2.applyOrElse(rules.scala:117)
  at org.apache.spark.sql.execution.datasources.PreprocessTableCreation$$anonfun$apply$2.applyOrElse(rules.scala:76)
...
scala> spark.range(3).write.insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
|  2|
|  0|
|  1|
+---+

¿InsertInto con SaveMode.Overwrite tiene algún sentido?

Creo que si le presta tanta atención SaveMode.Overwrite. Simplemente vuelve a crear la tabla de destino.

spark.range(3).write.mode("overwrite").insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
|  1|
|  0|
|  2|
+---+

Seq(100, 200, 300).toDF.write.mode("overwrite").insertInto("my_table")
scala> spark.table("my_table").show
+---+
| id|
+---+
|200|
|100|
|300|
+---+

Quiero señalar una gran diferencia entre SaveAsTable y insertInto en SPARK.

En tabla particionada overwrite SaveMode funciona de manera diferente en caso de SaveAsTable y insertInto.

Considere el siguiente ejemplo Donde estoy creando una tabla particionada usando SaveAsTable método.

hive> CREATE TABLE `db.companies_table`(`company` string) PARTITIONED BY ( `id` date);
OK
Time taken: 0.094 seconds
import org.apache.spark.sql._*
import spark.implicits._
import org.apache.spark.sql._

scala>val targetTable = "db.companies_table"

scala>val companiesDF = Seq(("2020-01-01", "Company1"), ("2020-01-02", "Company2")).toDF("id", "company")

scala>companiesDF.write.mode(SaveMode.Overwrite).partitionBy("id").saveAsTable(targetTable)

scala> spark.sql("select * from db.companies_table").show()
+--------+----------+
| company|        id|
+--------+----------+
|Company1|2020-01-01|
|Company2|2020-01-02|
+--------+----------+

Ahora estoy agregando 2 filas nuevas con 2 nuevos valores de partición.

scala> val companiesDF = Seq(("2020-01-03", "Company1"), ("2020-01-04", "Company2")).toDF("id", "company")

scala> companiesDF.write.mode(SaveMode.Append).partitionBy("id").saveAsTable(targetTable)

scala>spark.sql("select * from db.companies_table").show()

+--------+----------+                                                           
| company|        id|
+--------+----------+
|Company1|2020-01-01|
|Company2|2020-01-02|
|Company1|2020-01-03|
|Company2|2020-01-04|
+--------+----------+

Como puede ver, se agregan 2 filas nuevas a la tabla.

Ahora digamos que quiero Overwrite partición 2020-01-02 datos.

scala> val companiesDF = Seq(("2020-01-02", "Company5")).toDF("id", "company")

scala>companiesDF.write.mode(SaveMode.Overwrite).partitionBy("id").saveAsTable(targetTable)

Según nuestra lógica, solo las particiones 2020-01-02 deben sobrescribirse, pero el caso con SaveAsTable es diferente Sobrescribirá la tabla de entrada como puede ver a continuación.

scala> spark.sql("select * from db.companies_table").show()
+-------+----------+
|company|        id|
+-------+----------+
|Company5|2020-01-02|
+-------+----------+

Entonces, si queremos sobrescribir solo ciertas particiones en la tabla usando SaveAsTable no es posible.

Consulte este enlace para obtener más detalles. https://towardsdatascience.com/understanding-the-spark-insertinto-function-1870175c3ee9

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *