CDH Spark SQL

翻譯: https://www.cloudera.com/documentation/enterprise/latest/topics/spark_sparksql.html
版本: 5.14.2

Spark SQL允許您使用SQL或使用DataFrame API查詢Spark程序內(nèi)的結(jié)構(gòu)化數(shù)據(jù)。

有關(guān)Spark SQL的詳細(xì)信息,請(qǐng)參閱Spark SQL和DataFrame指南为流。

繼續(xù)閱讀:

SQLContext和HiveContext

所有Spark SQL功能的入口點(diǎn)是 SQLContext 類或其后代之一烫映。你創(chuàng)建一個(gè) SQLContext 從一個(gè) SparkContext 。使用SQLContext 兢交,您可以從RDD薪捍,Hive表或數(shù)據(jù)源創(chuàng)建DataFrame。

要在Spark應(yīng)用程序中使用存儲(chǔ)在Hive或Impala表中的數(shù)據(jù)配喳,請(qǐng)構(gòu)建一個(gè) HiveContext 酪穿,它繼承自SQLContext 。使用 HiveContext 晴裹,您可以訪問Hive或Impala表等代表的Metastore數(shù)據(jù)庫被济。

注意:
Hive和Impala表和相關(guān)的SQL語法在大多數(shù)方面是可以互換的。因?yàn)镾park使用底層Hive基礎(chǔ)架構(gòu)息拜,所以使用Spark SQL您可以使用HiveQL語法編寫DDL語句溉潭,DML語句和查詢。對(duì)于交互式查詢性能少欺,可以通過Impala使用impala-shell或Impala JDBC和ODBC接口訪問相同的表喳瓣。

如果你使用 spark-shell , 一個(gè) HiveContext 已經(jīng)為你創(chuàng)建赞别,并作為 sqlContext 變量畏陕。

如果你使用 spark-submit ,在程序開始時(shí)使用如下代碼:

Python:

from pyspark import SparkContext, HiveContext
sc = SparkContext(appName = "test")
sqlContext = HiveContext(sc)

Spark應(yīng)用程序提交的主機(jī) 或 spark-shell or pyspark 運(yùn)行的主機(jī)仿滔,運(yùn)行必須具有在Cloudera Manager 定義的Hive 網(wǎng)關(guān)角色以及部署的客戶端配置惠毁。

當(dāng)Spark作業(yè)訪問Hive視圖時(shí)犹芹,Spark必須有權(quán)讀取底層Hive表中的數(shù)據(jù)文件。目前鞠绰,Spark不能使用基于列或者where子句腰埂。如果Spark沒有底層數(shù)據(jù)文件所需的權(quán)限,則針對(duì)視圖的SparkSQL查詢將返回空結(jié)果集蜈膨,而不是錯(cuò)誤屿笼。

將文件查詢到DataFrame中

如果數(shù)據(jù)文件位于Hive或Impala表之外,則可以使用SQL將JSON或Parquet文件直接讀取到DataFrame中:

  • JSON:
df = sqlContext.sql("SELECT * FROM json.`input dir`")
  • Parquet:
df = sqlContext.sql("SELECT * FROM parquet.`input dir`")

請(qǐng)參閱在文件上運(yùn)行SQL翁巍。

Spark SQL示例

這個(gè)例子演示了如何使用sqlContext.sql 創(chuàng)建并加載兩個(gè)表驴一,并從表中選擇兩行到兩個(gè)DataFrame。接下來的步驟使用DataFrame API從其中一個(gè)表中過濾大于150,000的工資灶壶,并顯示結(jié)果DataFrame肝断。然后將這兩個(gè)DataFrame加入來創(chuàng)建第三個(gè)DataFrame。最后驰凛,新的DataFrame被保存到一個(gè)Hive表胸懈。

  1. 在命令行中,將Hue sample_07和sample_08 CSV文件復(fù)制到HDFS:
$ hdfs dfs -put HUE_HOME/apps/beeswax/data/sample_07.csv /user/hdfs
$ hdfs dfs -put HUE_HOME/apps/beeswax/data/sample_08.csv /user/hdfs

其中 HUE_HOME 默認(rèn)/opt/cloudera/parcels/CDH/lib/hue (包裹安裝)或 /usr/lib/hue(軟件包安裝)洒嗤。

  1. 開始 spark-shell:: spark-shell:
  1. 創(chuàng)建Hive表sample_07和sample_08:
scala> sqlContext.sql("CREATE TABLE sample_07 (code string,description string,total_emp int,salary int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TextFile")
scala> sqlContext.sql("CREATE TABLE sample_08 (code string,description string,total_emp int,salary int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TextFile")
  1. 在Beeline中箫荡,顯示Hive表:
[0: jdbc:hive2://hostname.com:> show tables;
+------------+--+
|  tab_name  |
+------------+--+
| sample_07  |
| sample_08  |
+------------+--+
  1. 將CSV文件中的數(shù)據(jù)加載到表中:
scala> sqlContext.sql("LOAD DATA INPATH '/user/hdfs/sample_07.csv' OVERWRITE INTO TABLE sample_07")
scala> sqlContext.sql("LOAD DATA INPATH '/user/hdfs/sample_08.csv' OVERWRITE INTO TABLE sample_08")
  1. 創(chuàng)建包含sample_07和sample_08表格內(nèi)容的DataFrame:
scala> val df_07 = sqlContext.sql("SELECT * from sample_07")
scala> val df_08 = sqlContext.sql("SELECT * from sample_08")
  1. 顯示薪水大于150,000的df_07中的所有行:
scala> df_07.filter(df_07("salary") > 150000).show()

輸出應(yīng)該是:

+-------+--------------------+---------+------+
|   code|         description|total_emp|salary|
+-------+--------------------+---------+------+
|11-1011|    Chief executives|   299160|151370|
|29-1022|Oral and maxillof...|     5040|178440|
|29-1023|       Orthodontists|     5350|185340|
|29-1024|     Prosthodontists|      380|169360|
|29-1061|   Anesthesiologists|    31030|192780|
|29-1062|Family and genera...|   113250|153640|
|29-1063| Internists, general|    46260|167270|
|29-1064|Obstetricians and...|    21340|183600|
|29-1067|            Surgeons|    50260|191410|
|29-1069|Physicians and su...|   237400|155150|
+-------+--------------------+---------+------+
  1. 通過加入df_07和df_08創(chuàng)建DataFrame df_09,僅保留 code and description 列渔隶。
scala> val df_09 = df_07.join(df_08, df_07("code") === df_08("code")).select(df_07.col("code"),df_07.col("description"))
scala> df_09.show()

新的DataFrame如下所示:

+-------+--------------------+
|   code|         description|
+-------+--------------------+
|00-0000|     All Occupations|
|11-0000|Management occupa...|
|11-1011|    Chief executives|
|11-1021|General and opera...|
|11-1031|         Legislators|
|11-2011|Advertising and p...|
|11-2021|  Marketing managers|
|11-2022|      Sales managers|
|11-2031|Public relations ...|
|11-3011|Administrative se...|
|11-3021|Computer and info...|
|11-3031|  Financial managers|
|11-3041|Compensation and ...|
|11-3042|Training and deve...|
|11-3049|Human resources m...|
|11-3051|Industrial produc...|
|11-3061| Purchasing managers|
|11-3071|Transportation, s...|
|11-9011|Farm, ranch, and ...|
|11-9012|Farmers and ranchers|
+-------+--------------------+
  1. 將DataFrame df_09另存為Hive表sample_09:
scala> df_09.write.saveAsTable("sample_09")
  1. 在Beeline中羔挡,顯示Hive表:
[0: jdbc:hive2://hostname.com:> show tables;
+------------+--+
|  tab_name  |
+------------+--+
| sample_07  |
| sample_08  |
| sample_09  |
+------------+--+

Python中的等效程序,您可以使用spark-submit提交间唉, 將會(huì):

from pyspark import SparkContext, SparkConf, HiveContext

if __name__ == "__main__":

  # create Spark context with Spark configuration
  conf = SparkConf().setAppName("Data Frame Join")
  sc = SparkContext(conf=conf)
  sqlContext = HiveContext(sc)
  df_07 = sqlContext.sql("SELECT * from sample_07")
  df_07.filter(df_07.salary > 150000).show()
  df_08 = sqlContext.sql("SELECT * from sample_08")
  tbls = sqlContext.sql("show tables")
  tbls.show()
  df_09 = df_07.join(df_08, df_07.code == df_08.code).select(df_07.code,df_07.description)
  df_09.show()
  df_09.write.saveAsTable("sample_09")
  tbls = sqlContext.sql("show tables")
  tbls.show()

而不是使用直線來顯示表格 , show tables 查詢使用Spark SQL API運(yùn)行绞灼。

確保HiveContext實(shí)現(xiàn)安全訪問

為了保證 HiveContext 強(qiáng)制ACL,按照同步HDFS ACL和Sentry權(quán)限中所述啟用HDFS-Sentry插件呈野。HDFS-Sentry插件不支持從Spark SQL進(jìn)行訪問的列級(jí)訪問控制低矮。

與Hive Views交互

當(dāng)Spark作業(yè)訪問Hive視圖時(shí),Spark必須有權(quán)讀取底層Hive表中的數(shù)據(jù)文件被冒。目前军掂,Spark不能使用基于列或者where子句。如果Spark沒有底層數(shù)據(jù)文件所需的權(quán)限昨悼,則針對(duì)視圖的SparkSQL查詢將返回空結(jié)果集蝗锥,而不是錯(cuò)誤。

Spark SQL DROP TABLE PURGE的性能和存儲(chǔ)注意事項(xiàng)

Hive中的 DROP TABLE 語句的 PURGE 子句 會(huì)立即刪除底層數(shù)據(jù)文件率触,而不會(huì)將其傳輸?shù)脚R時(shí)存儲(chǔ)區(qū)域(HDFS垃圾箱)中终议。

雖然 PURGE 子句被Spark SQL DROP TABLE 語句識(shí)別,此子句當(dāng)前不會(huì)傳遞給在后臺(tái)執(zhí)行“drop table”操作的Hive語句。所以穴张,如果你知道PURGE 行為對(duì)于性能细燎,存儲(chǔ)或安全性原因 非常重要,請(qǐng)執(zhí)行此操作DROP TABLE 直接在Hive中皂甘,例如通過beeline shell玻驻,而不是通過Spark SQL。

即時(shí)刪除方面 偿枕,PURGE 在以下情況下可能很重要:

  • 如果群集的存儲(chǔ)空間不足击狮,并且立即釋放空間非常重要,而不是等待HDFS垃圾箱定期清空益老。

  • 如果底層數(shù)據(jù)文件駐留在Amazon S3文件系統(tǒng)上。將文件從S3移動(dòng)到HDFS垃圾箱涉及物理復(fù)制文件寸莫,即默認(rèn)設(shè)置DROP TABLE S3上的行為涉及顯著的性能開銷捺萌。

  • 如果底層數(shù)據(jù)文件包含敏感信息,并且將其完全刪除非常重要膘茎,而不是通過定期清空垃圾箱來清除它們桃纯。

  • 如果對(duì)HDFS加密區(qū)域的限制阻止將文件移動(dòng)到HDFS垃圾箱。此限制主要適用于CDH 5.7及更低版本披坏。在CDH 5.8及更高版本中态坦,每個(gè)HDFS加密區(qū)都有自己的HDFS垃圾桶,因此不帶PURGE 子句的 DROP TABLE 行為正常棒拂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伞梯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帚屉,更是在濱河造成了極大的恐慌谜诫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攻旦,死亡現(xiàn)場離奇詭異喻旷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)牢屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門且预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烙无,你說我怎么就攤上這事锋谐。” “怎么了皱炉?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵怀估,是天一觀的道長。 經(jīng)常有香客問我,道長多搀,這世上最難降的妖魔是什么歧蕉? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮康铭,結(jié)果婚禮上惯退,老公的妹妹穿的比我還像新娘。我一直安慰自己从藤,他們只是感情好催跪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夷野,像睡著了一般懊蒸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悯搔,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天骑丸,我揣著相機(jī)與錄音,去河邊找鬼妒貌。 笑死通危,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灌曙。 我是一名探鬼主播菊碟,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼在刺!你這毒婦竟也來了逆害?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤增炭,失蹤者是張志新(化名)和其女友劉穎忍燥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隙姿,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梅垄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了输玷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队丝。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欲鹏,靈堂內(nèi)的尸體忽然破棺而出机久,到底是詐尸還是另有隱情,我是刑警寧澤赔嚎,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布膘盖,位于F島的核電站胧弛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侠畔。R本人自食惡果不足惜结缚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望软棺。 院中可真熱鬧红竭,春花似錦、人聲如沸喘落。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘦棋。三九已至稀火,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赌朋,已是汗流浹背憾股。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箕慧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓茴恰,卻偏偏與公主長得像颠焦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子往枣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容