Python 如何在PySpark中使用StructType将浮点转换为IntegerType?

Python 如何在PySpark中使用StructType将浮点转换为IntegerType?,python,types,pyspark,Python,Types,Pyspark,我正在尝试从Pandas数据框创建Spark数据框,其中我使用StructType类指定列数据类型。我已经将pandas数据框保存为df,spark数据框保存为data 在我开始之前,csv文件中有一个错误,我使用了pandas的read_csv方法的参数error_bad_line。我不熟悉火花当量 df=pd.read\u csv('Amazon\u responsed\u Oct05.csv',error\u bad\u lines=False) df.head() >>>> 用户\u i

我正在尝试从Pandas数据框创建Spark数据框,其中我使用StructType类指定列数据类型。我已经将pandas数据框保存为df,spark数据框保存为data

在我开始之前,csv文件中有一个错误,我使用了pandas的read_csv方法的参数error_bad_line。我不熟悉火花当量

df=pd.read\u csv('Amazon\u responsed\u Oct05.csv',error\u bad\u lines=False)
df.head()
>>>>
用户\u id\u str用户\u追随者\u计数文本_
0 143515471.0 1503@amazon帮助你能帮我吗?一个产品我。。。
1 85741735.0 149569@SeanEPanjab很抱歉,我们无法为您发送DM。。。
2 143515471.0 1503@AmazonHelp它是在。。。
3 143515471.0 1503@AmazonHelp我现在正在跟踪你,如果有帮助的话。。。
4 85741735.0 149569@SeanEPanjab请给我们打电话/聊天,以便我们。。。
注意user_id_str列是如何用浮点值填充的,下面的143515471.0就是引发错误的地方

data\u schema=[StructField('user\u followers\u count',IntegerType(),True),
StructField('user\u id\u str',StringType(),True),
StructField('text',StringType(),True)]
最终结构=结构类型(字段=数据模式)
data=spark.createDataFrame(df,schema=final_struc)
>>>>
TypeError:字段用户\追随者\计数:IntegerType无法接受类型中的对象143515471.0
我试着从最后解决这个问题,但没有成功

df.astype({'user\u id\u str':'int','user\u followers\u count':'int','text\u':'str'}).dtypes
测向头(1)
>>>>
用户\u id\u str用户\u追随者\u计数文本_
0 143515471.0 1503@amazon帮助你能帮我吗?一个产品我。。。
总之,我采取了各种方法来实现我的目标,创建了一个包含列数据类型、IntegerType、IntegerType和StringType的Spark数据框架,但没有成功。我非常希望能有一种方法来强制这种数据转换

编辑:

最后,我试着从Spark开始;但这也是徒劳的


data\u 1=spark.read.csv('Amazon\u responsed\u Oct05.csv',schema=final\u struc,enforceSchema=True)
数据_1.标题(5)
>>>>
+--------------------+-----------+----+
|用户|追随者|计数|用户| id | str |文本|
+--------------------+-----------+----+
|空|空|空|
|空|空|空|
|空|空|空|
|空|空|空|
|空|空|空|
+--------------------+-----------+----+
仅显示前5行

要将pandas数据帧转换为pyspark数据帧,请尝试以下操作

from pyspark.sql import Row
import pandas as pd
from pyspark.sql.types import StructField, StructType, StringType, IntegerType

#create a sample pandas dataframe
data = {'a':['hello', 'hi', 'world'], 'b':[5.0, 6.4, 9.7], 'c':[1,2,3]}
df = pd.DataFrame(data)
'''
    a       b       c
0   hello   5.0     1
1   hi      6.4     2
2   world   9.7     3
'''

#convert second column type to integer
df = df.astype({'b':'int'})
df
'''
    a       b       c
0   hello   5       1
1   hi      6       2
2   world   9       3
'''

#prepare the schema
fields = [StructField('a',StringType(),True),\
               StructField('b',IntegerType(),True),\
               StructField('c',IntegerType(),True)]
schema = StructType(fields)


#convert to a pyspark dataframe
rows = [Row(**_) for _ in df.to_dict(orient='records')]
#[Row(a='hello', b=5, c=1), Row(a='hi', b=6, c=2), Row(a='world', b=9, c=3)]
df_sp = spark.createDataFrame(rows, schema)
df_sp.show()
# +-----+---+---+
# |    a|  b|  c|
# +-----+---+---+
# |hello|  5|  1|
# |   hi|  6|  2|
# |world|  9|  3|
# +-----+---+---+


看起来你的答案地址不像使用StructType将浮点类型转换为整数类型。@mjake看看我编辑的答案。运行它,然后您将充分理解它,以适应您的示例。您的用户\u id\u str仍在打印xxxx.0,如果您已成功转换为整数,则不应发生这种情况。@mjake我很高兴听到这个消息。