您的位置:首页 > Web前端

如何避免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|

+----+----+-----+------+

通过实践,完全成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐