PySpark toPandas 函数正在改变列类型

Posted

技术标签:

【中文标题】PySpark toPandas 函数正在改变列类型【英文标题】:PySpark toPandas function is changing column type 【发布时间】:2020-03-24 16:38:28 【问题描述】:

我有一个具有以下架构的 pyspark 数据框:

root
 |-- src_ip: integer (nullable = true)
 |-- dst_ip: integer (nullable = true)

通过toPandas()将此数据帧转换为pandas时,列类型从spark中的整数变为pandas中的float:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9847 entries, 0 to 9846
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   src_ip  9607 non-null   float64
 1   dst_ip  9789 non-null   float64
dtypes: float64(2)
memory usage: 154.0 KB

有没有办法用toPandas() 保持整数值,或者我只能在生成的熊猫数据框中转换列类型?

【问题讨论】:

【参考方案1】:

SPARK-21766 (https://issues.apache.org/jira/browse/SPARK-21766) 解释了您观察到的行为。

作为一种解决方法,您可以在 toPandas() 之前调用 fillna(0):

df1 = sc.createDataFrame([(0, None), (None, 8)], ["src_ip", "dest_ip"])
print(df1.dtypes)

# Reproduce the issue
pdf1 = df1.toPandas()
print(pdf1.dtypes)

# A workaround
pdf2 = df1.fillna(0).toPandas()
print(pdf2.dtypes)

【讨论】:

以上是关于PySpark toPandas 函数正在改变列类型的主要内容,如果未能解决你的问题,请参考以下文章

toPandas() 会随着 pyspark 数据框变小而加快速度吗?

如何在 PySpark 中提取对长度敏感的特征而不使用 .toPandas() hack?

pyspark/EMR 中大型 DataFrame 上的 collect() 或 toPandas()

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

PySpark DataFrame的逐行聚合

toPandas() 在 Jupyter iPython Notebook 上工作,但提交失败 - AWS EMR