String Pyspark数据帧将元素作为变量进行连接

String Pyspark数据帧将元素作为变量进行连接,string,python-3.x,apache-spark,dataframe,pyspark,String,Python 3.x,Apache Spark,Dataframe,Pyspark,当我试图在pyspark dataframe连接函数中将连接元素作为变量传递时,我遇到了一个问题。当我试图在join语句中将其作为变量传递时,从文件中获取主键字段,它会抛出一个错误“无法解析列名”,因为它是作为字符串传递的。请在这方面帮助我 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] +")

当我试图在pyspark dataframe连接函数中将连接元素作为变量传递时,我遇到了一个问题。当我试图在join语句中将其作为变量传递时,从文件中获取主键字段,它会抛出一个错误“无法解析列名”,因为它是作为字符串传递的。请在这方面帮助我

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.*')

通过查看您的错误,您的
pr_列表
可能包含两个df中任何一个都不存在的列,或者您在加入之前没有为您的
dataframes添加别名

df1_with_db2 = df_a.alias("df_a").join(df_b.alias("df_b"), pr_str ,'inner').select('df_a.*')
下面是我解决此问题的方法:- 在您的代码中,我发现两个
dataframe
具有相同的列名称,它们位于列表
pr\u列表中

因此,您可以将此列表作为连接条件传递,如下所示(默认情况下,连接为
internal
):

您将只获得一次公共列,因此无需编写select函数 以下是一个例子:-

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|
+---+---+

显示此错误的原因是,在联接条件中,您将联接条件作为字符串传递,而在联接条件中,它接受单个列名或列名列表或带表达式的条件,您只需要对代码进行细微更改

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

@杰克,欢迎你,再读一遍,你会得到更多,我刚刚编辑过。
df1_with_db2 = df_a.alias("df_a").join(df_b, eval(pr_str) ,'inner').select('df_a.*')