zoukankan      html  css  js  c++  java
  • 如何使Spark Dataframe区分具有重复名称的列,避免References ambiguous问题

    前言

    有时候我们在使用Spark中执行Join时候,结果集出现重复的列名,从而导致References ambiguous问题。我们可以用以下方式来解决。

    实例

    首先模拟一些数据

    #In python
    from pyspark.mllib.linalg import SparseVector
    from pyspark.sql import Row
    
    df1 = sqlContext.createDataFrame([
        Row(a=107831, f=SparseVector(
            5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
        Row(a=125231, f=SparseVector(
            5, {0: 0.0, 1: 0.0, 2: 0.0047, 3: 0.0, 4: 0.0043})),
    ])
    
    df2 = sqlContext.createDataFrame([
        Row(a=107831, f=SparseVector(
            5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
        Row(a=107831, f=SparseVector(
            5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
    ])
    

    为了防止出现重复列名的问题,首先可以指定使用哪张表的列,如下:

    df1.join(df2, df1['a'] == df2['a']).select(df1['f']).show(2)
    
    ##  +--------------------+
    ##  |                   f|
    ##  +--------------------+
    ##  |(5,[0,1,2,3,4],[0...|
    ##  |(5,[0,1,2,3,4],[0...|
    ##  +--------------------+
    

    当然我们也可以使用别名alias:

    from pyspark.sql.functions import col
    
    df1_a = df1.alias("df1_a")
    df2_a = df2.alias("df2_a")
    
    df1_a.join(df2_a, col('df1_a.a') == col('df2_a.a')).select('df1_a.f').show(2)
    
    ##  +--------------------+
    ##  |                   f|
    ##  +--------------------+
    ##  |(5,[0,1,2,3,4],[0...|
    ##  |(5,[0,1,2,3,4],[0...|
    ##  +--------------------+
    

    除此之外,我们还可以编程式的重命名列来避免模糊列名:

    df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns))
    df2_r = df1.select(*(col(x).alias(x + '_df2') for x in df2.columns))
    
    df1_r.join(df2_r, col('a_df1') == col('a_df2')).select(col('f_df1')).show(2)
    
    ## +--------------------+
    ## |               f_df1|
    ## +--------------------+
    ## |(5,[0,1,2,3,4],[0...|
    ## |(5,[0,1,2,3,4],[0...|
    ## +--------------------+
    

    当然还有一种简单的方法,可以在结果表中只产生一份用于连接的列,

    df1.join(df2,['a'])
    

    参考

    Spark Dataframe distinguish columns with duplicated name

  • 相关阅读:
    Java工具类
    集合 -- 嵌套表
    集合--索引表
    第一章
    记录Record
    序列Sequence
    操纵数据库 DML
    表的集合操作
    视图
    索引
  • 原文地址:https://www.cnblogs.com/lestatzhang/p/10688267.html
Copyright © 2011-2022 走看看