所以我试图2连接2个数据帧,这样做时出现以下错误。
TypeError:“列”对象不可调用
我将数据作为简单的csv文件加载,以下是从CSV加载的架构。
根 |-movie_id,title:字符串(nullable = true)
根 |-user_id,movie_id,标签,时间戳:字符串(可为null,为true)
以下是我的加载实现
df1 = spark.read.format("csv").option("header", "true").load("collaborative/titles.csv", header=True, sep="|")
df2 = spark.read.format("csv").option("header", "true").load("collaborative/tags.csv", header=True, sep="|")
df1.printSchema()
df2.printSchema()
df1.alias("df1").join(df2.alias("df2"), col("df1.movie_id").equalTo(col("df2.movie_id"))).select(col("df2.*"))
答案 0 :(得分:1)
列对象上没有称为equalTo
的方法。当您执行col("df1.movie_id").equalTo
时,它假设您正在访问movie_id
中的嵌套字段并返回另一列,因此错误:列对象不可调用。
print(col('df1.movie_id').equalTo)
# Column<b'df1.movie_id[equalTo]'>
要解决此问题,请遵循correct join syntax here。
对于您而言,最简单的解决方案是在加入之前从df1
删除不相关的列,这样您就不必为数据帧创建别名并稍后选择:
df1.select('movie_id').join(df2, 'movie_id').show()
答案 1 :(得分:0)
您可以尝试以下操作:
d1 = df1.alias("df1")
d2 = df2.alias("df2")
d1.join(d2,d1.movie_id == d2.movie_id).select('df2.*')
您可以参考pyspark连接示例here。