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