sparkSQLJAVA
『壹』 spark從hive數據倉庫中讀取的數據可以使用sparksql進行查詢嗎
1、為了讓Spark能夠連接到Hive的原有數據倉庫,我們需要將Hive中的hive-site.xml文件拷貝到Spark的conf目錄下,這樣就可以通過這個配置文件找到Hive的元數據以及數據存放。
在這里由於我的Spark是自動安裝和部署的,因此需要知道CDH將hive-site.xml放在哪裡。經過摸索。該文件默認所在的路徑是:/etc/hive/conf 下。
同理,spark的conf也是在/etc/spark/conf。
此時,如上所述,將對應的hive-site.xml拷貝到spark/conf目錄下即可
如果Hive的元數據存放在Mysql中,我們還需要准備好Mysql相關驅動,比如:mysql-connector-java-5.1.22-bin.jar。
2、編寫測試代碼
val conf=new SparkConf().setAppName("Spark-Hive").setMaster("local")
val sc=new SparkContext(conf)
//create hivecontext
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ") //這里需要注意數據的間隔符
sqlContext.sql("LOAD DATA INPATH '/user/liujiyu/spark/kv1.txt' INTO TABLE src ");
sqlContext.sql(" SELECT * FROM jn1").collect().foreach(println)
sc.stop()
3、下面列舉一下出現的問題:
(1)如果沒有將hive-site.xml拷貝到spark/conf目錄下,會出現:
分析:從錯誤提示上面就知道,spark無法知道hive的元數據的位置,所以就無法實例化對應的client。
解決的辦法就是必須將hive-site.xml拷貝到spark/conf目錄下
(2)測試代碼中沒有加sc.stop會出現如下錯誤:
ERROR scheler.LiveListenerBus: Listener EventLoggingListener threw an exception
java.lang.reflect.InvocationTargetException
在代碼最後一行添加sc.stop()解決了該問題。
『貳』 Spark SQL怎麼創建編程創建DataFrame
創建 SQLContext
Spark SQL 中所有相關功能的入口點是 SQLContext 類或者它的子類, 創建一個 SQLContext 的所有需要僅僅是一個 SparkContext。
使用 Scala 創建方式如下:
val sc: SparkContext // An existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._
使用 Java 創建方式如下:
JavaSparkContext sc = ...; // An existing JavaSparkContext.
SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc);
使用 Python 創建方式如下:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
除了一個基本的 SQLContext,你也能夠創建一個 HiveContext,它支持基本 SQLContext 所支持功能的一個超集。它的額外的功能包括用更完整的 HiveQL 分析器寫查詢去訪問 HiveUDFs 的能力、 從 Hive 表讀取數據的能力。用 HiveContext 你不需要一個已經存在的 Hive 開啟,SQLContext 可用的數據源對 HiveContext 也可用。HiveContext 分開打包是為了避免在 Spark 構建時包含了所有 的 Hive 依賴。如果對你的應用程序來說,這些依賴不存在問題,Spark 1.3 推薦使用 HiveContext。以後的穩定版本將專注於為 SQLContext 提供與 HiveContext 等價的功能。
用來解析查詢語句的特定 SQL 變種語言可以通過 spark.sql.dialect 選項來選擇。這個參數可以通過兩種方式改變,一種方式是通過 setConf 方法設定,另一種方式是在 SQL 命令中通過 SET key=value 來設定。對於 SQLContext,唯一可用的方言是 「sql」,它是 Spark SQL 提供的一個簡單的 SQL 解析器。在 HiveContext 中,雖然也支持」sql」,但默認的方言是 「hiveql」,這是因為 HiveQL 解析器更完整。
『叄』 sparkSQL和spark有什麼區別
Spark為結構化數據處理引入了一個稱為Spark SQL的編程模塊。簡而言之,sparkSQL是Spark的前身,是在Hadoop發展過程中,為了給熟悉RDBMS但又不理解MapRece的技術人員提供快速上手的工具。
sparkSQL提供了一個稱為DataFrame(數據框)的編程抽象,DF的底層仍然是RDD,並且可以充當分布式SQL查詢引擎。
SparkSql有哪些特點呢?
1)引入了新的RDD類型SchemaRDD,可以像傳統資料庫定義表一樣來定義SchemaRDD。
2)在應用程序中可以混合使用不同來源的數據,如可以將來自HiveQL的數據和來自SQL的數據進行Join操作。
3)內嵌了查詢優化框架,在把SQL解析成邏輯執行計劃之後,最後變成RDD的計算。
『肆』 java怎麼連接sparksql集群
首先確保SQLSERVER服務正在運行,並可以允許遠程訪問連接 然後按如下步驟進行連接 1.安裝JDBC驅動 1)下載JDBC驅動 2)執行sqljdbc_4.0.2206.100_chs.exe解壓驅動文件 3)拷貝以下目錄中的sqljdbc_auth.dll到Windows的System32目錄。
『伍』 如何引入 org.apache.spark.sql.sparksession 在哪個jar包中
在eclipse中,依次選擇「File」 –>「New」 –> 「Other…」 –> 「Scala Wizard」 –> 「Scala Project」,創建一個Scala工程,並命名為「SparkScala」。
右擊「SaprkScala」工程,選擇「Properties」,在彈出的框中,按照下圖所示,依次選擇「Java Build Path」 –>「Libraties」 –>「Add External JARs…」,導入文章「Apache Spark:將Spark部署到Hadoop 2.2.0上」中給出的
assembly/target/scala-2.9.3/目錄下的spark-assembly-0.8.1-incubating- hadoop2.2.0.jar,這個jar包也可以自己編譯spark生成,放在spark目錄下的assembly/target/scala- 2.9.3/目錄中。
『陸』 spark sql 執行jdbc時可以不對sql進行解析嗎
首先確保SQLSERVER服務正在運行,並可以允許遠程訪問連接
然後按如下步驟進行連接
1.安裝JDBC驅動
1)下載JDBC驅動
2)執行sqljdbc_4.0.2206.100_chs.exe解壓驅動文件
3)拷貝以下目錄中的sqljdbc_auth.dll到Windows的System32目錄。對x64的機子,x64的dll拷到C:\Windows\System32,x86的dll拷到C:\Windows\SysWOW64目錄。
Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\chs\auth\
2.在Java程序中連接SQL Server
classpath中加上安裝好的SQL Server jdbc jar包
Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\chs\sqljdbc4.jar
連接SQL Server的JDBC代碼
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:54364;databaseName=master;IntegratedSecurity=True";
Connection con = DriverManager.getConnection(url);
在SQL Server Browser服務開啟的情況下也可以通過服務名連接
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost\\SQLEXPRESS;databaseName=master;IntegratedSecurity=True";
Connection con = DriverManager.getConnection(url);
3.身份驗證模式
SQL Server默認使用Windows身份驗證模式,這也是官方推薦的模式,安全性更高。上面的連接例子就是採用的Windows認證。如果要使用混合認證模式,需要下載SQL Server Management Studio,並通過SQL Server Management Studio修改認證模式為混合認證模式。
SQL Server Management Studio的下載地址
http://www.microsoft.com/zh-cn/download/details.aspx?id=8961
修改SQL Server認證模式的方法
http://technet.microsoft.com/zh-cn/library/ms188670(v=sql.105).aspx
混合認證模式下,可以由資料庫進行認證,連接時需要提供用戶名和密碼
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:54364;databaseName=master";
Connection con = DriverManager.getConnection(url,"user","password");
『柒』 只會sql 怎麼學習spark sql
SQL Server,MySQL,SparkSQL。其實你只需要關注SQL三個字母就可以了,不要在意前綴後綴。SQL其實算一個標准,而上面三者其實算是幾個實現。你當然可以跳過,但是不管學哪個,你都得先了解下SQL本身。
SparkSQL跟前兩者差別實在太大了,談不上取代。但是我覺得對於數據分析來說,以後Spark平台很有前途,所以這其實是一個不錯的選擇。但是,SparkSQL其實只是帶來了一些方便,你千萬別認為用了SparkSQL就能作數據分析了,因為現在說這話實在太早了。
你覺得現在SparkSQL的可用性已經到達這個程度了嗎看
Spark生態圈還遠沒有完善到這個程度。比如SparkSQL還僅僅是alpha狀態,MLlib演算法也非常少,MLBase可能要等相當長的一段時間才會出來。
如果是工程師,現在Spark的基礎API已經趨於完善,很多東西可能自己寫就行了。但如果是數據分析師,可能你就不太可能獨立做這件事了,可能需要工程師團隊協助才行。
『捌』 如何使用 Spark SQL
一、啟動方法
/data/spark-1.4.0-bin-cdh4/bin/spark-sql --master spark://master:7077 --total-executor-cores 10 --executor-memory 1g --executor-cores 2
註:/data/spark-1.4.0-bin-cdh4/為spark的安裝路徑
/data/spark-1.4.0-bin-cdh4/bin/spark-sql –help 查看啟動選項
--master MASTER_URL 指定master url
--executor-memory MEM 每個executor的內存,默認為1G
--total-executor-cores NUM 所有executor的總核數
-e <quoted-query-string> 直接執行查詢SQL
-f <filename> 以文件方式批量執行SQL
二、Spark sql對hive支持的功能
1、查詢語句:SELECT GROUP BY ORDER BY CLUSTER BY SORT BY
2、hive操作運算:
1) 關系運算:= ==, <>, <, >, >=, <=
2) 算術運算:+, -, *, /, %
3) 邏輯運算:AND, &&, OR, ||
4) 復雜的數據結構
5) 數學函數:(sign, ln, cos, etc)
6) 字元串函數:
3、 UDF
4、 UDAF
5、 用戶定義的序列化格式
6、join操作:JOIN {LEFT|RIGHT|FULL} OUTER JOIN LEFT SEMI JOIN CROSS JOIN
7、 unions操作:
8、 子查詢: SELECT col FROM ( SELECT a + b AS col from t1) t2
9、Sampling
10、 Explain
11、 分區表
12、 視圖
13、 hive ddl功能:CREATE TABLE、CREATE TABLE AS SELECT、ALTER TABLE
14、 支持的數據類型:TINYINT SMALLINT INT BIGINT BOOLEAN FLOAT DOUBLE STRING BINARY TIMESTAMPDATE ARRAY MAP STRUCT
三、Spark sql 在客戶端編程方式進行查詢數據
1、啟動spark-shell
./spark-shell --master spark://master:7077 --total-executor-cores 10 --executor-memory 1g --executor-cores 2
2、編寫程序
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.read.json("../examples/src/main/resources/people.json")
查看所有數據:df.show()
查看錶結構:df.printSchema()
只看name列:df.select("name").show()
對數據運算:df.select(df("name"), df("age") + 1).show()
過濾數據:df.filter(df("age") > 21).show()
分組統計:df.groupBy("age").count().show()
1、查詢txt數據
import sqlContext.implicits._
case class Person(name: String, age: Int)
val people = sc.textFile("../examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")
val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")
2、parquet文件
val df = sqlContext.read.load("../examples/src/main/resources/users.parquet")
3、hdfs文件
val df = sqlContext.read.load("hdfs://namenode.Hadoop:9000/user/hive/warehouse/spark_test.db/test_parquet/part-r-00001.gz.parquet")
4、保存查詢結果數據
val df = sqlContext.read.load("../examples/src/main/resources/users.parquet")
df.select("name", "favorite_color").write.save("namesAndFavColors.parquet「)
四、Spark sql性能調優
緩存數據表:sqlContext.cacheTable("tableName")
取消緩存表:sqlContext.uncacheTable("tableName")
spark.sql.inMemoryColumnarStorage.compressedtrue當設置為true時,Spark SQL將為基於數據統計信息的每列自動選擇一個壓縮演算法。
spark.sql.inMemoryColumnarStorage.batchSize10000柱狀緩存的批數據大小。更大的批數據可以提高內存的利用率以及壓縮效率,但有OOMs的風險