Spark potrafi czytać i pisz dane do/z relacyjnych baz danych przy użyciu źródła danych JDBC (tak jak w pierwszym przykładzie kodu).
Ponadto (i całkowicie osobno) spark umożliwia używanie SQL do wysyłania zapytań o widoki które zostały utworzone na danych, które zostały już załadowane do DataFrame z jakiegoś źródła. Na przykład:
val df = Seq(1,2,3).toDF("a") // could be any DF, loaded from file/JDBC/memory...
df.createOrReplaceTempView("my_spark_table")
spark.sql("select a from my_spark_table").show()
Tylko "tabele" (nazywane widokami, od Spark 2.0.0) utworzone w ten sposób mogą być odpytywane przy użyciu SparkSession.sql
.
Jeśli Twoje dane są przechowywane w relacyjnej bazie danych, Spark będzie musiał je najpierw odczytać, a dopiero potem będzie mógł wykonać dowolne rozproszone obliczenia na załadowanej kopii. Konkluzja - możemy załadować dane z tabeli za pomocą read
, utwórz widok tymczasowy, a następnie przeprowadź zapytanie:
ss.read
.format("jdbc")
.option("url", "jdbc:mysql://127.0.0.1/database_name")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.load()
.createOrReplaceTempView("my_spark_table")
// and then you can query the view:
val df = ss.sql("select * from my_spark_table where ... ")