飛谷云 MySQL 第3講
MySQL+表連接(下)
一窝革、MySQL+表連接(下)
1、內(nèi)連接(inner join):結(jié)果僅滿足條件的行
select * from T1,T2 where T1.stud_code=T2.stud_code;
select * from T1 inner join T2 ON T1.stud_code=T2.stud_code;#效率比上句高
2虐译、左連接(left outer join):
顯示左表T1中的所有行,并把右表T2中符合條件加到左表T1中侮攀;
右表T2中不符合條件,就不用加入結(jié)果表中撇叁,并且NULL表示税朴。
select * from T1 left outer join T2 ON T1.stud_code=T2.stud_code;
3家制、右連接(right outer join)
顯示右表T2中的所有行颤殴,并把左表T1中符合條件加到右表T2中鼻忠;
左表T1中不符合條件帖蔓,就不用加入結(jié)果表中,并且NULL表示澈侠。
4哨啃、全連接(full outer join)
顯示左表T1写妥、右表T2兩邊中的所有行珍特,即把左聯(lián)結(jié)果表 + 右聯(lián)結(jié)果表組合在一起扎筒,然后過濾掉重復(fù)的。
/*內(nèi)連接*/
select * from stud_info T1 ,stud_score T2 WHERE T1.stud_code=T2.stud_code;
select * from stud_info T1 inner join stud_score T2 ON T1.stud_code=T2.stud_code;
/*左連接*/
select * from stud_info T1 LEFT OUTER join stud_score T2 ON T1.stud_code=T2.stud_code;
/*右連接*/
select * from stud_info T1 RIGHT OUTER join stud_score T2 ON T1.stud_code=T2.stud_code;
二宋距、pandas 中的 DataFrame的表連接
- 導(dǎo)入必要的包或模塊
import numpy as np
import pandas as pd
from pandas import DataFrame
import MySQLdb
兩個DataFrame數(shù)據(jù)集如何進(jìn)行關(guān)系谚赎?
df1=DataFrame({'key':['a','a','b','c','c'],'data1':range(5)})
df2=DataFrame({'key':['a','b','d'],'data1':range(3)})
- 內(nèi)連接
df3=pd.merge(df1,df2,on='key')
df4=pd.merge(df1,df2,on='key',how='inner')
df5=pd.merge(df1,df2,left_on='key',right_on='key',how='inner')
#左連接
df_l=pd.merge(df1,df2,on='key',how='left')
#右連接
df_r=pd.merge(df1,df2,on='key',how='right')
#全連接
df_a=pd.merge(df1,df2,on='key',how='outer')
- 兩個表結(jié)構(gòu)相同字段,自動添加后綴雳灵,_x,_y,我們也可以自定義闸盔,后綴,通過
suffixes=(‘_left’躲撰,‘_right’)
df6=pd.merge(df1,df2,on='key',how='inner',suffixes=('_left','_right'))
#選擇數(shù)據(jù)
df7=df6[['key','data1_right']]
#修改列名(data1_right改為data)
df8=df7.rename(columns={'data1_right':'data'})
#保存結(jié)果
df8.to_csv('data07.csv')
df8.to_csv('data07.csv',index=False,cols=['key','data'])##忽略行索引
- 把MySQL數(shù)據(jù)庫表導(dǎo)入pandas
conn= MySQLdb.connect(host='localhost',port=3306,user='feigu_mysql', passwd='feigu2016', db='testdb',charset='utf8')
data2 = pd.read_sql('select * from stud_info', conn)
- 如果文件較大拢蛋,也可可以逐塊讀蔫巩,如:chunksize=1000(行)
`inputfile1 = '/home/feigu/python_test/data/stud_score.csv'`
#輸入的數(shù)據(jù)文件
`inputfile2 = '/home/feigu/python_test/data/stud_info.csv'`
#輸入的數(shù)據(jù)文件
data1 = pd.read_csv(inputfile1) #讀取數(shù)據(jù)
data2 = pd.read_csv(inputfile2) #讀取數(shù)據(jù)
df1=DataFrame(data1) #轉(zhuǎn)換為DataFrame格式
df2=DataFrame(data2) #轉(zhuǎn)換為DataFrame格式
#如果要跳過一些行圆仔,可以加上參數(shù)坪郭,skiprow[0,2]
pd.read_csv(inputfile2,skiprow[0,2])跳過第1行,第3行
df.count() #查看非NA值得數(shù)量
df.columns #查看列名
df.<tab> #查看df可以使用的方法
df.head(2) #查看前2行
df.tail(2) #查看倒數(shù)2行
三信姓、把數(shù)據(jù)導(dǎo)入Spark-SQL中的DataFrame結(jié)構(gòu)中
#把數(shù)據(jù)導(dǎo)入spark-rdd
#進(jìn)入交互式編程環(huán)境
spark-shell --master local[2]
==========使用scala語言==========
// 首先用已有的Spark Context對象創(chuàng)建SQLContext對象
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// 導(dǎo)入語句绸罗,可以隱式地將RDD轉(zhuǎn)化成DataFrame
import sqlContext.implicits._
// 創(chuàng)建一個表示stud的自定義類
case class stud_score(stud_code:String, sub_code:String, sub_name: String, sub_tech: String, sub_score: Int)
//用文件創(chuàng)建一個RDD
val rdd_st = sc.textFile("file:///home/hadoop/data/stud_score.csv")
//轉(zhuǎn)換為含case的rdd
val rdd_case=rdd_st.map(_.split(",")).map(p => stud_score(p(0), p(1), p(2), p(3), p(4).trim.toInt))
//把RDD轉(zhuǎn)換為DataFrame
val dfstud=rdd_case.toDF()
// 將DataFrame注冊為一個表
dfstud.registerTempTable("stud_score")
// 用sqlContext對象提供的sql方法執(zhí)行SQL語句菊值。
val result80 = sqlContext.sql("SELECT * FROM stud_score where sub_score>=80")
//顯示結(jié)果
result80.show()
result80.take(6)
//也可以保存
result80.rdd.saveAsTextFile("/home/hadoop/data")