任何結構性的資料(ex:Json)在Spark SQL下,都可以透過createOrReplaceTempView("view名稱")
告知Spark SQL
你將資料註冊成一個view,之後就可以用熟悉的SQL語法來檢索資料!
scala> val task = spark.read.json("file:///data_toysrus.json")
scala> task.craeteOrReplaceTempView("toysrus")
但是光資料庫就各有各的山頭,SQL語法當然也是!
今天就拿W3School貼的語法來實測看看Spark SQL的支援程度!
第一個登場的是 MySQL
:
scala> val mysql = spark.sql("SELECT * FROM toysrus LIMIT 3")
scala> mysql.show
+----------+------------+----------+-------+-------------+---------+--------+
|customerId|customerName| date4T| price|productAmount|productId| time4T|
| 51| aclindsa|2018-05-11|9506.21| 1| 68| 6:55 AM|
| 99|adamschwartz|2018-05-11|4107.59| 5| 86| 7:39 PM|
| 79| ben|2018-05-11|2987.22| 7| 58|11:57 AM|
+----------+------------+----------+-------+-------------+---------+--------+
看起來mysql
是被Spark SQL認可接受的!
第二個登場的是 MSSQL
:
scala> val mssql = spark.sql("SELECT TOP 3 * FROM toysrus")
scala> mssql.show
org.apache.spark.sql.catalyst.parser.ParseException:
... ...
== SQL ==
SELECT TOP 3 * FROM toysrus
-----------^^^
TOP語法掛了,立馬噴錯!mssql
挑戰失敗!
第三個登場的是 Oracle
:
scala> val oracle = spark.sql("SELECT * FROM toysrus WHERE ROWNUM <= 3")
scala> oracle.show
org.apache.spark.sql.AnalysisException: cannot resolve 'ROWNUM' given input
columns: [... ...
... ...
ROWNUM被判定為欄位,但實際Json資料本來就沒ROWNUM這個屬性!oracle
挑戰失敗!
問一下, Spark SQL 要怎麼用,
是用什麼後端語言呢?
還是也像MySql之類的要安裝一個Server?
Spark SQL只是Spark框架提供的其中一項服務,其他還有Spark串流、GraphX、以及機器學習等服務。而Spark本身只是提供一種"彈性分散式資料儲存(RDD)"的框架,透過Spark部屬在多台電腦,可直接在多台電腦的記憶體上進行資料處理;目的就是處理RDB所不堪負荷處理的即時資料及大數據。目前Spark的後端語言主要是Java、Scala、Python(Spark SQL還支援R)。不過資料量如果不大例如GB等級以下,或是非即時性,其實效能未必贏過RDB!以上只是小弟個人粗略見解,魚大有興趣的話可參考joechh大大的Spark in Scala鐵人30天,或者Apache Spark入門(1)
恩恩,感恩~有空來研究一下...