Python 如何在PySpark中使用StructType将浮点转换为IntegerType?
我正在尝试从Pandas数据框创建Spark数据框,其中我使用StructType类指定列数据类型。我已经将pandas数据框保存为df,spark数据框保存为data 在我开始之前,csv文件中有一个错误,我使用了pandas的read_csv方法的参数error_bad_line。我不熟悉火花当量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
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我很高兴听到这个消息。