为啥 toPandas() 会抛出错误,而 .show() 工作得很好?

Posted

技术标签:

【中文标题】为啥 toPandas() 会抛出错误,而 .show() 工作得很好?【英文标题】:Why does toPandas() throw error while .show() works perfectly fine?为什么 toPandas() 会抛出错误,而 .show() 工作得很好? 【发布时间】:2019-08-18 18:06:58 【问题描述】:

我正在尝试加入两个 PySpark 数据框。从长远来看,如果 df1 中的值在 df2 中匹配,我想更改它。我正在编写 Jupyter 笔记本。

当我尝试加入然后执行 .show() 时,一切都成功了。但是,一旦我想转换为 Pandas 数据框,就会出现值错误。

运行良好的代码:

temp = df_1.join(df_2, on='number').limit(30)
temp.show()

我已经找到Pyspark - saveAsTable throws index error while show() dataframe works perfectly,但是除了增加限制之外,我尝试过计数,两次操作都成功了,所以我不完全确定这是否是由于惰性评估造成的。

导致问题的代码:

temp = df_1.join(df_2, on='number').limit(30)
temp.toPandas()

我想看到的是连接表的前几行格式正确

每当我使用 .toPandas() 时,都会出现值错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

在这种情况下,这条错误消息对我来说没有多大意义。

有人有什么提示吗?这可能是由于重复的列标题吗?我忽略了什么吗?

编辑: 我正在尝试提供更多代码:

w2 = Window.partitionBy(df_0a["key"]).orderBy(df_0a["int_value_tf"].desc())
df_1 = df_0a.select('*',f.rank().over(w2).alias('rn'))\
    .filter(f.col("rn") == 1).drop("rn")

df_2 = df_0a.join(df_0b, df_0a.number == df_0b.c_number)\
    .drop(df_0b.c_number)\
    .withColumn("pn", f.when(f.col("p") == "NaN", f.col("ic1")).otherwise(f.col("p")))\
    .filter("NOT pn == 'NaN'")

@cs95:我知道这仍然不是真正的复制粘贴信息。如果有帮助,我可以尝试将所有相关表格的前几行匿名化?

两个数据框都相当大,df_0b 的列名与 df_0a 不同。

【问题讨论】:

你有重现问题的代码吗? temp.show(30) 有效吗? (鉴于 temp 只有 30 行,因为您要限制它?)。可能是有一个损坏的行(可能由某些 UDF 引入),它只会在调用 toPandas() 而不是 show() 时评估(如果它不在前 20 行中),也不在 count() 所以,事实证明,由于列的名称重复而引发了错误——我对子选择进行了选择,并且连接工作正常。我发现这个错误相当不直观。 你说得对 【参考方案1】:

升级安妮在上述评论中的回答,以备将来使用:

如果列有重复的名称,即使它们包含别名并使用 .select() 选择,也会发生这种情况

df_a.join(df_b,on="c")
df_a.select("df_a.colname","df_b.colname").toPandas() <-- does not work
df_a.select("df_a.colname","df_b.colname").show() <-- works correctly

【讨论】:

以上是关于为啥 toPandas() 会抛出错误,而 .show() 工作得很好?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在类构造函数中使用 setState 方法时 React 会抛出错误?

为啥完成Activity会抛出NPE?

为啥 BluetoothSetLocalServiceInfo 会抛出错误 1314?

为啥 jsonwebtoken 会抛出“无效签名”错误?

为啥 MERGE 语句会抛出唯一键约束错误

为啥 MeasureString 会抛出读/写内存错误?