【发布时间】:2016-09-22 06:35:07
【问题描述】:
您好,我有 2 个数据框要加入
#df1
name genre count
satya drama 1
satya action 3
abc drame 2
abc comedy 2
def romance 1
#df2
name max_count
satya 3
abc 2
def 1
现在我想在名称和计数上加入 2 个以上的 dfs==max_count,但我遇到了一个错误
import pyspark.sql.functions as F
from pyspark.sql.functions import count, col
from pyspark.sql.functions import struct
df = spark.read.csv('file',sep = '###', header=True)
df1 = df.groupBy("name", "genre").count()
df2 = df1.groupby('name').agg(F.max("count").alias("max_count"))
#Now trying to join both dataframes
final_df = df1.join(df2, (df1.name == df2.name) & (df1.count == df2.max_count))
final_df.show() ###Error
#py4j.protocol.Py4JJavaError: An error occurred while calling o207.showString.
: org.apache.spark.SparkException: Exception thrown in awaitResult:
at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:194)
#Caused by: java.lang.UnsupportedOperationException: Cannot evaluate expression: count(1)
at org.apache.spark.sql.catalyst.expressions.Unevaluable$class.doGenCode(Expression.scala:224)
但“左”加入成功
final_df = df1.join(df2, (df1.name == df2.name) & (df1.count == df2.max_count), "left")
final_df.show() ###Success but i don't want left join , i want inner join
我的问题是为什么上面的失败了,我在那里做错了吗???
我将此链接称为“Find maximum row per group in Spark DataFrame”。使用了第一个答案(2 groupby 方法)。但同样的错误。
我正在使用 spark-2.0.0-bin-hadoop2.7 和 python 2.7。
请建议。谢谢。
编辑:
上述场景适用于spark 1.6(令人惊讶的是spark 2.0有什么问题(或者我的安装,我将在这里重新安装、检查和更新)。
有没有人在 spark 2.0 上尝试过这个并获得了成功,按照下面 Yaron 的回答???
【问题讨论】:
-
只是猜测.....列名会与数据框方法冲突吗?例如。
count。不知道为什么这只会影响内部连接。您可以尝试将count重命名为cnt或其他内容以排除这种可能性。 -
@RedBaron-Alredy 试过了。同样的错误。
标签: python apache-spark pyspark pyspark-sql