【发布时间】: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()
-
所以,事实证明,由于列的名称重复而引发了错误——我对子选择进行了选择,并且连接工作正常。我发现这个错误相当不直观。
-
你说得对
标签: python pandas pyspark data-conversion