gpt4 book ai didi

python - Pyspark .toPandas() 导致对象列中预期的数字一

转载 作者:太空狗 更新时间:2023-10-30 01:07:04 25 4
gpt4 key购买 nike

我从我们的数据仓库中提取数据,将其存储在一个 parquet 文件中,然后将所有 parquet 文件加载到一个 spark 数据帧中。到目前为止,一切都很好。但是,当我尝试使用 pandas.plot() 函数对其进行绘图时,它会抛出一个“TypeError: Empty 'DataFrame': no numeric data to plot”

所以我开始向后调查我的来源,我认为从我的初始 sql 语句转换为十进制是问题之一。但我不知道如何解决这个问题。我认为 fillna(0) 可以解决问题,但事实并非如此。

第 1 步:定义用于提取数据的 SQL 语句

mpr_sql = """
select
CAST(DATE_KEY AS INTEGER) AS DATE_KEY ,
CAST(AMD AS INTEGER) AS AMD ,
CAST(AMD_2 AS DECIMAL(12,2)) AS AMD_2 ,
CAST(AMD_3 AS DECIMAL(12,2)) AS AMD_3 ,
CAST(AMD_4 AS DECIMAL(12,2)) AS AMD_4 ,
CAST(AMD_0 AS DECIMAL(12,2)) AS AMD_0
"""

第 2 步:从提取的数据创建 spark 数据框

df1 = sqlContext.load(source="jdbc", 
driver="com.teradata.jdbc.TeraDriver",
url=db_url,
user=db_user
TMODE="TERA",
password=db_pwd,
dbtable="( "+sql+") a")

第 3 步:将 spark 数据帧存储在具有 10 个分区的 parquet 文件中

df1.coalesce(10).write.parquet("./mpr"+month+"sorted.parquet")
df = sqlContext.read.parquet('./mpr*sorted.parquet')

第 4 步:查看 spark 数据帧架构(它显示 decimal(12,2))

df.printSchema()
root
|-- DATE_KEY: integer (nullable = true)
|-- AMD: integer (nullable = true)
|-- AMD_2: decimal(12,2) (nullable = true)
|-- AMD_3: decimal(12,2) (nullable = true)
|-- AMD_4: decimal(12,2) (nullable = true)
|-- AMD_0: decimal(12,2) (nullable = true)

第 5 步:将 spark 数据帧转换为 pandas 数据帧并将所有空值替换为 0(使用 fillna(0))

pdf=df.fillna(0).toPandas()

第 6 步:查看相关列的 pandas 数据框信息。 AMD 是正确的(整数),但 AMD_4 是类型对象,我希望它是 double 或 float 或类似的东西(抱歉总是忘记正确的类型)。而且由于 AMD_4 是非数字类型,我不能用它来绘制。

pdf[['AMD','AMD4']].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 20 entries, 20140101 to 20150801
Data columns (total 2 columns):
AMD 20 non-null int64
AMD_4 20 non-null object
dtypes: int64(1), object(1)
memory usage: 480.0+ bytes

所以我的问题是:

  1. 为什么 AMD_4(以及此处未显示的其他 AMD_x 列)是对象类型,而 AMD 是 int64 类型?
  2. 或者换句话说,我怎样才能使 AMD_x 列成为 float/double/decimal 类型

最佳答案

我遇到了同样的问题,后来我想出了是什么原因。

在转换过程中,有数据类型的合并,比如int/long -> int64,double -> float64,string->obj。对于所有未知的数据类型,都会转换为obj类型。

在Pandas DataFrame中,没有decimal数据类型,所以decimal数据类型的所有列都转换为obj类型。

如果您可以在应用 toPandas() 之前将所有 decimal 数据类型转换为 double 类型,您将准备好使用所有数值数据。

from pyspark.sql.functions import *
from pyspark.sql.types import *
df = df.withColumn('AMD_4', col('AMD_4').cast(DoubleType())).withColumn('AMD_2', col('AMD_2').cast(DoubleType()))
pdf = df.toPandas()

在 pdf 中,AMD_4 和 AMD_2 现在将是数字。

关于python - Pyspark .toPandas() 导致对象列中预期的数字一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33481572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com