【问题标题】:Pyspark dataframe join elements as variablesPyspark 数据框将元素连接为变量
【发布时间】:2018-08-14 09:30:10
【问题描述】:

当我尝试将连接元素作为 pyspark 数据框连接函数中的变量传递时,我遇到了一个问题。我正在从文件中获取主键字段,而我试图在连接语句中将其作为变量传递,它会引发错误,因为它是作为字符串传递的“无法解析列名”。请协助我。

for i in range(len(pr_list)):
    if i != len(pr_list)-1:
        pr_str += " (df_a." + pr_list[i] + " == df_b." +pr_list[i] +") & "
    else:
        pr_str += "(df_a." + pr_list[i]  + " == df_b." +pr_list[i]  +")"
print (pr_str)

df1_with_db2 = df_a.join(df_b, pr_str ,'inner').select('df_a.*')

【问题讨论】:

    标签: string python-3.x apache-spark dataframe pyspark


    【解决方案1】:

    显示此错误的原因是因为在连接条件中您将连接条件作为字符串传递,而在连接条件中它接受单个列名或列名列表或带有表达式的条件,您只想次要修改代码

    df1_with_db2 = df_a.alias("df_a").join(df_b, eval(pr_str) ,'inner').select('df_a.*')
    

    【讨论】:

      【解决方案2】:

      通过查看您的错误,您的 pr_list 可以包含在 2 df 中的任何一个上都不存在的列,或者您在加入之前没有为 dataframes 加上别名

      df1_with_db2 = df_a.alias("df_a").join(df_b.alias("df_b"), pr_str ,'inner').select('df_a.*')
      

      下面是我解决这个问题的方法:-

      在您的代码中,我发现 dataframe 具有相同的列名称,并且在列表 pr_list

      所以你可以像下面这样将这个列表作为连接条件传递(默认连接是inner):

      df1_with_db2 = df_a.join(
                  df_b, 
                  pr_list
            )
      

      你只会得到一次公共列,所以不需要编写选择函数

      这是一个例子:-

      df1 = sqlContext.createDataFrame([
          [1,2],
          [3,4],
          [9,8]
      ], ['a', 'b'])
      
      df2 = sqlContext.createDataFrame([
          [1,2],
          [3,4],
          [18,19]
      ], ['a', 'b'])
      
      jlist = ['a','b'] 
      
      df1.join(df2, jlist).show()
      +---+---+
      |  a|  b|
      +---+---+
      |  1|  2|
      |  3|  4|
      +---+---+
      

      【讨论】:

      • @Jack 欢迎,再读一遍你会得到更多,我刚刚编辑了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2017-02-25
      • 2021-12-21
      • 1970-01-01
      • 2018-01-31
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多