說明:java
spark --version : 2.2.0node
我有兩個json文件,分別是emp和dept:sql
emp內容以下:json
{"name": "zhangsan", "age": 26, "depId": 1, "gender": "male", "salary": 20000} {"name": "lisi", "age": 36, "depId": 2, "gender": "female", "salary": 8500} {"name": "wangwu", "age": 23, "depId": 1, "gender": "male", "salary": 5000} {"name": "zhaoliu", "age": 25, "depId": 3, "gender": "male", "salary": 7000} {"name": "marry", "age": 19, "depId": 2, "gender": "female", "salary": 6600} {"name": "Tom", "age": 36, "depId": 1, "gender": "female", "salary": 5000} {"name": "kitty", "age": 43, "depId": 2, "gender": "female", "salary": 6000} {"name": "Tony","age": 36,"depId": 4,"gender":"female","salary": 4030}
dept內容以下:windows
{"id": 1, "name": "Tech Department"} {"id": 2, "name": "Fina Department"} {"id": 3, "name": "HR Department"}
如今我須要經過sparksql將兩個文件加載進來並作join,最後將結果保存到本地app
下面是操做步驟:ide
一、初始化配置 oop
val conf = new SparkConf().setMaster("local[2]").setAppName("Load_Data") val sc = new SparkContext(conf) val ssc = new sql.SparkSession.Builder() .appName("Load_Data_01") .master("local[2]") .getOrCreate() sc.setLogLevel("error") //測試環境爲了少打印點日誌,我將日誌級別設置爲error
二、將兩個json文件加載進來測試
val df_emp = ssc.read.json("file:///E:\\javaBD\\BD\\json_file\\employee.json") val df_dept = ssc.read.format("json").load("file:///E:\\javaBD\\BD\\json_file\\department.json")
三、分別將加載進來的兩個json文件打印出來,看看是否成功載入ui
df_emp.show() df_dept.show()
四、數據加載都沒有問題,接下來兩者進行join操做:
df_emp.join(df_dept,df_emp("depId") === df_dept("id"),"left").show()
五、這樣結果也能夠正常打印出來了,貌似是沒有什麼問題了,接下來直接就save就能夠了唄,可是進行save的時候就報錯了:
df_emp.join(df_dept,df_emp("depId") === df_dept("id"),"left").write.mode(SaveMode.Append).csv("file:///E:\\javaBD\\BD\\json_file\\rs")
因而開始百度,找到了緣由,論壇連接,大體的意思就是說,要保存的表中有相同的name字段,這樣是不行的,那麼解決方案就很明顯了,讓兩個那麼字段名稱不相同麼,那就分別給他們其別名唄,接下來開始修改代碼:
一、初始化配置不變
二、讀文件不變
三、跟別獲取到兩個DF(json文件加載加載進來以後就是兩個DF)的列明,並進行分別設置別名
//分別拿出兩張表的列名 val c_emp = df_emp.columns val c_dept = df_dept.columns //分別對兩張表的別名進行設置 val emp = df_emp.select(c_emp.map(n => df_emp(n).as("emp_" + n)): _*) val dept = df_dept.select(c_dept.map(n => df_dept(n).as("dept_" + n)): _*)
四、接着在進行保存,程序報錯消失:
emp.join(dept,emp("emp_depId") === dept("dept_id"),"left").write.mode(SaveMode.Append).csv("file:///E:\\javaBD\\BD\\json_file\\rs")
這裏的這個保存的路徑說名一下:我是保存在windows本地,由於我配置了hadoop的環境變量,因此若是寫本地須要這樣寫,若是去掉"file:///"的話,idea會認爲是hdfs的路徑,全部會報錯路徑找不到錯誤,若是要寫入到hdfs的話,最好將地址寫全:hdfs://namenode_ip:9000/file
程序沒有報錯,而後到指定目錄下查看,文件是否寫入:
文件已經成功寫入,over