python-3.x Spark中的数据类型转换

swvgeqrz  于 2023-11-20  发布在  Python
关注(0)|答案(2)|浏览(112)

我有一个列id,它的类型是int,但后来改为bigint。它有两种类型的值。

from pyspark.sql.functions import *
from pyspark.sql.types import * 

df = spark.read.parquet('hdfs path')
df = df.select("id", "code")

df=df.withColumn("id1", df["id"].cast(LongType()))
res1=df.select("id1", "code")

res1.show(1, False)

字符串
它向我显示了 Dataframe ,但当我尝试对它们执行一些操作时,例如:

res1.groupBy('code').agg(countDistinct("id1")).show(1, False)


我得到Column: [id], Expected: int, Found: INT64
我试过mergeSchema也没有工作。

x6yk4ghg

x6yk4ghg1#

from pyspark.sql.functions import *
from pyspark.sql.types import * 

df1 = spark.read.parquet('hdfs path')
df2 = df1.select("id", "code")

df3 = df2.withColumn("id1", df2["id"].cast(LongType()))
res1=df3.select("id1", "code")

res1.show(1, False)

res1.groupBy("code").agg(countDistinct("id1")).show(1, False)

字符串
这应该是可行的。在spark中, Dataframe 是不可变的,所以你不应该把转换操作的值赋给同一个df变量,你应该使用不同的变量名。在scala中,这会给你给予编译时错误,但在python中是允许的,所以你不会注意到它。
如果你愿意,你也可以链接你所有转换,得到一个单独的df变量,并对它执行groupby操作,如下所示:

df = spark.read.parquet('hdfs path').select("id", "code").withColumn("id1", col("id").cast(LongType())).select("id1", "code")
df.groupBy("code").agg(countDistinct("id1")).show(1, False)

c0vxltue

c0vxltue2#

此错误可能是由于正在读取的数据的架构造成的。请尝试在读取链中使用read.option('mergeSchema', 'true')以强制架构变得兼容。

相关问题