spark-DataFrame学习记录-[2]解决spark-dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
2016-12-09 10:26
381 查看
【1】转帖部分
转自:http://blog.csdn.net/sparkexpert/article/details/52837269如分别创建两个DF,其结果如下: val df = sc.parallelize(Array( ("one", "A", 1), ("one", "B", 2), ("two", "A", 3), ("two", "B", 4) )).toDF("key1", "key2", "value") df.show() +----+----+-----+ |key1|key2|value| +----+----+-----+ | one| A| 1| | one| B| 2| | two| A| 3| | two| B| 4| +----+----+-----+ val df2 = sc.parallelize(Array( ("one", "A", 5), ("two", "A", 6) )).toDF("key1", "key2", "value2") df2.show() +----+----+------+ |key1|key2|value2| +----+----+------+ | one| A| 5| | two| A| 6| +----+----+------+ 对其进行JOIN操作之后,发现多产生了KEY1和KEY2这样的两个字段。 val joined = df.join(df2, df("key1") === df2("key1") && df("key2") === df2("key2"), "left_outer") joined.show() +----+----+-----+----+----+------+ |key1|key2|value|key1|key2|value2| +----+----+-----+----+----+------+ | two| A| 3| two| A| 6| | two| B| 4|null|null| null| | one| A| 1| one| A| 5| | one| B| 2|null|null| null| +----+----+-----+----+----+------+ 假如这两个字段同时存在,那么就会报错,如下:org.apache.spark.sql.AnalysisException: Reference 'key2' is ambiguous 因此,网上有很多关于如何在JOIN之后删除列的,后来经过仔细查找,才发现通过修改JOIN的表达式,完全可以避免这个问题。而且非常简单。主要是通过Seq这个对象来实现。 df.join(df2, Seq("key1", "key2"), "left_outer").show() +----+----+-----+------+ |key1|key2|value|value2| +----+----+-----+------+ | two| A| 3| 6| | two| B| 4| null| | one| A| 1| 5| | one| B| 2| null| +----+----+-----+------+
df.join(df2, Seq("key1"), "left_outer").show() //df // +----+----+-----+ // |key1|key2|value| // +----+----+-----+ // | one| A| 1| // | one| B| 2| // | two| A| 3| // | two| B| 4| // +----+----+-----+ //df2 // +----+----+------+ // |key1|key2|value2| // +----+----+------+ // | one| A| 5| // | two| A| 6| // +----+----+------+ // +----+----+-----+----+------+ // |key1|key2|value|key2|value2| // +----+----+-----+----+------+ // | two| A| 3| A| 6| // | two| B| 4| A| 6| // | one| A| 1| A| 5| // | one| B| 2| A| 5| // +----+----+-----+----+------+
【2】自测其他方式部分
withColumnRenamed方式将其中一个表的类名字改掉
package com.dt.spark.main.DataFrameLearn import org.apache.log4j.{Level, Logger} import org.apache.spark.sql.hive.HiveContext import org.apache.spark.{SparkConf, SparkContext} /** * spark-DataFrame学习记录-[2]解决spark-dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决) */ object DataFrameSQL_2 { def main(args: Array[String]) { val conf = new SparkConf() conf.setAppName("test") conf.setMaster("local") val sc = new SparkContext(conf) //设置日志级别 Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.apache.spark.sql").setLevel(Level.WARN) val sqlContext = new HiveContext(sc) import sqlContext.implicits._ val df = sc.parallelize(Array( ("one", "A", 1), ("one", "B", 2), ("two", "A", 3), ("two", "B", 4) )).toDF("key1", "key2", "value") df.show() // +----+----+-----+ // |key1|key2|value| // +----+----+-----+ // | one| A| 1| // | one| B| 2| // | two| A| 3| // | two| B| 4| // +----+----+-----+ val df2 = sc.parallelize(Array( ("one", "A", 5), ("two", "A", 6) )).toDF("key1", "key2", "value2") df2.show() // +----+----+------+ // |key1|key2|value2| // +----+----+------+ // | one| A| 5| // | two| A| 6| // +----+----+------+ val joined = df.join(df2, df("key1") === df2("key1") && df("key2") === df2("key2"), "left_outer") joined.show() // +----+----+-----+----+----+------+ // |key1|key2|value|key1|key2|value2| // +----+----+-----+----+----+------+ // | two| A| 3| two| A| 6| // | two| B| 4|null|null| null| // | one| A| 1| one| A| 5| // | one| B| 2|null|null| null| // +----+----+-----+----+----+------+ df.join(df2, Seq("key1", "key2"), "left_outer").show() // +----+----+-----+------+ // |key1|key2|value|value2| // +----+----+-----+------+ // | two| A| 3| 6| // | two| B| 4| null| // | one| A| 1| 5| // | one| B| 2| null| // +----+----+-----+------+ val df22 = df2.withColumnRenamed("key1","k1").withColumnRenamed("key2","k2") df.join(df22,df("key1") === df22("k1") && df("key2") === df22("k2"), "left_outer").show() // +----+----+-----+----+----+------+ // |key1|key2|value| k1| k2|value2| // +----+----+-----+----+----+------+ // | two| A| 3| two| A| 6| // | two| B| 4|null|null| null| // | one| A| 1| one| A| 5| // | one| B| 2|null|null| null| // +----+----+-----+----+----+------+ sc.stop() } }
相关文章推荐
- 如何避免spark dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
- spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题
- spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)
- 设计模式学习1—使用单件模式解决对象重复申请问题
- 解决因页面刷新而导致重复操作的问题
- 主数据上载因重复记录报错问题解决
- "BOF或EOF中有一个是真,或者当前的记录已被删除,所需的操作要求一个当前的记录"问题解决
- liferay-tomcat注册服务的方法和之后产生的乱码问题的解决办法
- 这里是dom操作的问题 , 需要记录下来 ,之后参考使用
- IE6,7,8下使用Javascript记录光标选中范围(已补全)(已解决单个节点内部重复字符的问题)
- android 解决 addView()操作之后,之前的控件位置重置的问题
- python django学习-问题记录及解决方法
- verilog学习过程中待解决的问题,先记录下来
- ESXi(ESXi 4.1)相关问题解决方法和操作学习笔记
- Repast HPC Tutorial学习操作中出现的问题及解决办法(更新ing)
- thread_join.c:(.text+0x6f): undefined reference to `pthread_create' 问题的解决
- 解决数据库中记录重复问题
- 【记录】正则表达式学习第3天(正则学习笔记),又解决了个实际问题。
- 今天开始陆续记录学习和工作碰到的问题及解决办法
- 如何解决Oracle“不能创建唯一索引,发现重复记录”问题