说明:

  spark --version : 2.2.0

  我有两个json文件,分别是emp和dept:

emp内容如下:

  1. {"name": "zhangsan", "age": 26, "depId": 1, "gender": "male", "salary": 20000}
  2. {"name": "lisi", "age": 36, "depId": 2, "gender": "female", "salary": 8500}
  3. {"name": "wangwu", "age": 23, "depId": 1, "gender": "male", "salary": 5000}
  4. {"name": "zhaoliu", "age": 25, "depId": 3, "gender": "male", "salary": 7000}
  5. {"name": "marry", "age": 19, "depId": 2, "gender": "female", "salary": 6600}
  6. {"name": "Tom", "age": 36, "depId": 1, "gender": "female", "salary": 5000}
  7. {"name": "kitty", "age": 43, "depId": 2, "gender": "female", "salary": 6000}
  8. {"name": "Tony","age": 36,"depId": 4,"gender":"female","salary": 4030}

dept内容如下:

  1. {"id": 1, "name": "Tech Department"}
  2. {"id": 2, "name": "Fina Department"}
  3. {"id": 3, "name": "HR Department"}

现在我需要通过sparksql将两个文件加载进来并做join,最后将结果保存到本地

下面是操作步骤:

  1、初始化配置  

  1. val conf = new SparkConf().setMaster("local[2]").setAppName("Load_Data")
  2. val sc = new SparkContext(conf)
  3. val ssc = new sql.SparkSession.Builder()
  4. .appName("Load_Data_01")
  5. .master("local[2]")
  6. .getOrCreate()
  7. sc.setLogLevel("error") //测试环境为了少打印点日志,我将日志级别设置为error

  2、将两个json文件加载进来

  1. val df_emp = ssc.read.json("file:///E:\\javaBD\\BD\\json_file\\employee.json")
  2. val df_dept = ssc.read.format("json").load("file:///E:\\javaBD\\BD\\json_file\\department.json")

  3、分别将加载进来的两个json文件打印出来,看看是否成功载入

  1. df_emp.show()
  2. df_dept.show()

  

  

  4、数据加载都没有问题,接下来二者进行join操作:

  1. df_emp.join(df_dept,df_emp("depId") === df_dept("id"),"left").show()

  

  5、这样结果也可以正常打印出来了,貌似是没有什么问题了,接下来直接就save就可以了呗,但是进行save的时候就报错了:

  1. 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字段,这样是不行的,那么解决方案就很明显了,让两个那么字段名称不相同么,那就分别给他们其别名呗,接下来开始修改代码:

  1、初始化配置不变

  2、读文件不变

  3、跟别获取到两个DF(json文件加载加载进来之后就是两个DF)的列明,并进行分别设置别名 

  1. //分别拿出两张表的列名
  2. val c_emp = df_emp.columns
  3. val c_dept = df_dept.columns
  4. //分别对两张表的别名进行设置
  5. val emp = df_emp.select(c_emp.map(n => df_emp(n).as("emp_" + n)): _*)
  6. val dept = df_dept.select(c_dept.map(n => df_dept(n).as("dept_" + n)): _*)

  4、接着在进行保存,程序报错消失:

  1. 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

关于在使用sparksql写程序是报错以及解决方案:org.apache.spark.sql.AnalysisException: Duplicate column(s): "name" found, cannot save to file.的更多相关文章

  1. Django(21)migrate报错的解决方案

    前言 在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本.映射到数据库中.创建新的表或者修改表的结构. 问题1:migrate怎么判断哪 ...

  2. vue-cesium中经纬度写反了,报错

    vue-cesium中经纬度写反了,报错 [Vue warn]: Invalid prop: custom validator check failed for prop "position ...

  3. Spark程序编译报错error: object apache is not a member of package org

    Spark程序编译报错: [INFO] Compiling 2 source files to E:\Develop\IDEAWorkspace\spark\target\classes at 156 ...

  4. 运行netcore2.2程序是报错

    运行netcore2.2程序是报错 C:\myself\WuZhui\WuZhui\bin\Release\netcoreapp2.2>dotnet WuZhui.DLLError: An as ...

  5. 新手常见的python报错及解决方案

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们.后续会不断补充. 目录 1.NameErr ...

  6. 关于mybatis的xml文件中使用 >= 或者 <= 号报错的解决方案

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  7. 报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'username'

    在提交注册信息的时候报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key ' ...

  8. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  9. Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案

    Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案 网上太多相关资料,但是抄袭严重,有的讲的也是之言片语的,根本不连贯(可能知道的人确实不想多说) 我总共 ...

随机推荐

  1. python --- 07 补充( join 删除和添加 fromkeys ) 深浅拷贝

    一.基本数据类型补充 1.join() "*".join("马虎疼") # 马*虎*疼 把传递进去的参数进行迭代.  获取到的每个元素和前面的*进行拼接. 得到 ...

  2. Junit的套件使用

    定义一个类,在类的上方添加@RunWith(Suite.class)和@SuiteClasses({XX.class,YY.class,...}) 实例有两个类分别为:public class Log ...

  3. The Mathematics of the Rubik’s Cube

    https://web.mit.edu/sp.268/www/rubik.pdf Introduction to Group Theory and Permutation Puzzles March ...

  4. 【htop】Linux CentOS 6.5下安装htop进程管理工具

    一.Htop的使用简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (fo ...

  5. Java 多线程案例

    同步代码块 SynchronizedTest类,用来表示取票功能 package concurency.chapter6; public class SynchronizedTest implemen ...

  6. POJ 2409 Let it Bead

    思路 同这道题,只是颜色数从3变成c 代码 #include <cstdio> #include <algorithm> #include <cstring> #d ...

  7. 题解——HDU 4734 F(x) (数位DP)

    这道题还是关于数位DP的板子题 数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律 然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ...

  8. AtomicReference实现单例模式

    CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试. 乐观锁的一种实 ...

  9. spring配置freemarker

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  10. 【转载】EclEmma工具介绍

    https://wenku.baidu.com/view/1017567e5acfa1c7aa00cc5f.html https://www.ibm.com/developerworks/cn/rat ...