關於在使用sparksql寫程序是報錯以及解決方案:org.apache.spark.sql.AnalysisException: Duplicate column(s): "name" found,

說明: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

相關文章
相關標籤/搜索