当您连接具有相似列名称的两个DF时:
df = df1.join(df2, df1['id'] == df2['id'])
Run Code Online (Sandbox Code Playgroud)
加入工作正常,但你不能调用id列,因为它是不明确的,你会得到以下异常:
pyspark.sql.utils.AnalysisException: "Reference 'id' is ambiguous, could be: id#5691, id#5918.;"
Run Code Online (Sandbox Code Playgroud)
这使得id不再可用......
以下函数解决了该问题:
def join(df1, df2, cond, how='left'):
df = df1.join(df2, cond, how=how)
repeated_columns = [c for c in df1.columns if c in df2.columns]
for col in repeated_columns:
df = df.drop(df2[col])
return df
Run Code Online (Sandbox Code Playgroud)
我不喜欢它的是我必须迭代列名称并删除它们为什么由一个.这看起来很笨重......
您是否知道任何其他解决方案将更优雅地加入和删除重复项或删除多个列而不迭代它们?
我正在尝试找到一个使用List [Column进行spark选择的好方法,我正在爆炸一个列,而不是使用我的爆炸列传回我感兴趣的所有列.
var columns = getColumns(x) // Returns a List[Column]
tempDf.select(columns) //trying to get
Run Code Online (Sandbox Code Playgroud)
试着找到一个好方法,我知道,如果它是一个字符串,我可以做类似的事情
val result = dataframe.select(columnNames.head, columnNames.tail: _*)
Run Code Online (Sandbox Code Playgroud) 我想将join与3个数据框一起使用,但是有些列我们不需要,或者与其他数据框有重复的名称,因此我想删除一些列,如下所示:
result_df = (aa_df.join(bb_df, 'id', 'left')
.join(cc_df, 'id', 'left')
.withColumnRenamed(bb_df.status, 'user_status'))
Run Code Online (Sandbox Code Playgroud)
请注意,该status列位于两个数据帧中,即aa_df和bb_df。
上面的方法不起作用。我也尝试使用withColumn,但是创建了新列,而旧列仍然存在。