如何避免spark dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
2016-10-17 11:31
1586 查看
spark datafrme提供了强大的JOIN操作。
但是在操作的时候,经常发现会碰到重复列的问题。如下:
如分别创建两个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,其结果如下:
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|
+----+----+-----+------+
通过实践,完全成功!
相关文章推荐
- spark-DataFrame学习记录-[2]解决spark-dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
- Spark 2.0 DataFrame map操作中Unable to find encoder for type stored in a Dataset问题的分析与解决
- Spark 2.0 DataFrame map操作中Unable to find encoder for type stored in a Dataset.问题的分析与解决
- 对spark dataframe join之后的列值NULL值进行填充为指定数值的操作
- Spark 2.0 DataFrame map操作中Unable to find encoder for type stored in a Dataset.问题的分析与解决
- Spark 2.0 DataFrame map操作中Unable to find encoder for type stored in a Dataset.问题的分析与解决
- 如何应对SparkSQL DataFrame保存到hdfs时出现的过多小文件问题
- 使用dataframe解决spark TopN问题:分组、排序、取TopN和join相关问题
- 如何解决 hibernate 多级对象加载并避免join和N+1次查询问题
- spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)
- 解决在ajax回调函数中循环遍历data数组无法获取数组下标为0之后的重复数据的问题
- 一句话知识:如何解决winform自动缩放产生的布局问题.
- 如何解决:ERROR: the user data image is used by another emulator. aborting 的问题
- 多线程 DLL 回调函数问题,当应用程序退出时,有些操作并未完成,造成程序内存泄露,如何解决呢
- 如何解决SQL Server对上亿表的排序和join连接问题?
- c#字符串转datatime时,因操作系统不一致产生的问题解决方法
- 如何解决大量字符串的拼接操作的耗时问题
- MYSQL重复安装产生的问题解决办法
- 如何解决:ERROR: the user data image is used by another emulator. aborting 的问题
- asp.net mvc 表单重复提交问题。如何解决呀?