Spark 上的 Pandas 命令出错?

Posted

技术标签:

【中文标题】Spark 上的 Pandas 命令出错?【英文标题】:Error with Pandas command on Spark? 【发布时间】:2017-07-10 17:05:46 【问题描述】:

首先我想说我是 Spark 的新手。我有一个需要在 Spark 上运行的 Pandas 工作程序。我正在使用 Databricks 来执行此操作。初始化 'sqlContext' 和 'sc' 后,我加载一个 CSV 文件并创建一个 Spark 数据框。完成此操作后,我将此数据帧转换为 Pandas 数据帧,我已经在其中编写了代码来完成我需要做的事情。

目标:我需要加载一个 CSV 文件并识别数据类型并返回每一列的数据类型。棘手的部分是日期有多种格式,为此我编写了(在这个社区的帮助下)正则表达式来匹配。我对每种数据类型都这样做。最后,我将列转换为正确的类型并打印每个列类型。

成功加载我的 Pandas 数据框后,我收到此错误:“TypeError: to_numeric() got an unexpected keyword argument 'downcast'”

我正在运行的代码触发了这个:

 # Changing the column data types
if len(int_count) == len(str_count):
    df[lst[col]] = pd.to_numeric(df[lst[col]], errors='coerce', downcast='integer')
if len(float_count) == len(str_count):
    df[lst[col]] = pd.to_numeric(df[lst[col]], errors='coerce', downcast='float')
if len(boolean_count) == len(str_count):
    df[lst[col]] = df[lst[col]].astype('bool')
if len(date_count) == len(str_count):
    df[lst[col]] = pd.to_datetime(df[lst[col]], errors='coerce')

'lst' 是列标题,'col' 是我用来遍历列标题的变量。此代码在 PyCharm 上运行时运行良好。不知道为什么我在 Spark 上收到此错误。

任何帮助都会很棒!

【问题讨论】:

df 是熊猫数据框还是 Spark 数据框?错误发生在哪个确切的命令中?分享代码的更多细节不会有什么坏处…… @desertnaut df 是我的 Pandas 数据框。发现这是我第一个带有向下转换的命令,这是一个错误。我不想在这里发布我的整个代码,但我很乐意发布更多信息。 所以,这听起来像是一个与熊猫相关的问题 - 看不到 Spark 与它有什么关系(除了转换初始数据帧)。我建议尝试将初始数据直接加载到 pandas df - 如果您仍然遇到问题,它确实与 Spark 无关(无论如何,'pandas command on Spark' 并不是对您问题的准确描述)。 【参考方案1】:

来自您的 cmets:

我曾尝试将初始数据直接加载到 pandas df 中,但它一直给我一个错误,说该文件不存在,这就是为什么我必须在将其加载到 Spark 后对其进行转换。

所以,我的回答与 Spark 无关,只是将数据上传到 Databricks Cloud(社区版),这似乎是您真正的问题。

在初始化集群并上传文件user_info.csv后,我们得到这个截图:

包括我们上传文件的实际路径。

现在,在 Databricks 笔记本中,如果您尝试在 pandas 中使用此确切路径,您将收到 File does not exist 错误:

 import pandas as pd
 pandas_df = pd.read_csv("/FileStore/tables/1zpotrjo1499779563504/user_info.csv")
 [...]
 IOError: File /FileStore/tables/1zpotrjo1499779563504/user_info.csv does not exist

因为,正如 instructions 明确提到的那样,在这种情况下(即,您希望直接在 pandas 或 R 中而不是 Spark 中加载的文件)您需要在文件路径前加上 /dbfs

 pandas_df = pd.read_csv("/dbfs/FileStore/tables/1zpotrjo1499779563504/user_info.csv") # works OK
 pandas_df.head() # works OK

【讨论】:

感谢您的回复!虽然我可以直接将它作为 Pandas 数据框上传,但我仍然遇到我最初提到的相同错误。我真的不知道该联系哪个社区,因为我有点迷茫为什么它不起作用。如果有帮助,这是我的完整代码:codesend.com/view/19783918ed48c5546829571fda051986 @rmahesh 所以,至少现在你知道这不是因为 Spark,所以可以说我的回答并非没有优点(你甚至可以投票赞成)。检查版本不兼容性(Databricks CE 运行 Python 2.7.12 和 pandas 0.18.1),如果错误仍然存​​在,请向 Databricks forums.databricks.com 提出问题 您的回答绝对有道理,我只是想提供所有信息。如果出现此错误,我会联系 Databricks,再次感谢您。 @rmahesh 你解决过这个问题吗?我遇到了同样的问题 @Kate 我不这么认为。

以上是关于Spark 上的 Pandas 命令出错?的主要内容,如果未能解决你的问题,请参考以下文章

Python pands和matplotlib常用命令

由Kaggle竞赛wiki文章流量预测引发的pandas内存优化过程分享

Pandas 到 pyspark cumprod 函数

spark 集群处理后转单机pyspark 或 pands 数据处理 的方法

Pandas 重置索引深度总结

通过 Windows 命令行使用 conda 安装 sklearn_pandas