大数据系列:如何改变Spark DataFrame中列的类型?

介绍

在Dataframe的操作中,我们经常需要做列(Column)的类型转换,如将Int型转换为字符串型,将字符串类型转换成float浮点类型,PySpark提供了很多种方式可以实现这样的转化,现在我们介绍三种常用的方法。

本范例使用如下数据集:

# 测试Dataframe中column type转换的不同方法

from pyspark.sql import SparkSession

spark = SparkSession \

.builder \

.appName("pyspark convert dataframe column's type") \

.config("spark.some.config.option", "some-value") \

.getOrCreate()

df_sql = spark.read.csv('./examples.csv',header=True)

输出

root

|-- _c0: string (nullable = true)

|-- Address: string (nullable = true)

|-- Age: string (nullable = true)

|-- Name: string (nullable = true)

|-- Sex: string (nullable = true)

方法一:利用withColumn函数实现对DataFrame中列的类型转换

# 方法1:使用withcolumn
from pyspark.sql.types import IntegerType, StringType

df_sql = df_sql.withColumn('Age',df_sql['Age'].cast(IntegerType()))
df_sql.printSchema()

输出:

root

|-- _c0: string (nullable = true)

|-- Address: string (nullable = true)

|-- Age: integer (nullable = true)

|-- Name: string (nullable = true)

|-- Sex: string (nullable = true)

方法二:通过SparkSQL,使用sql的内置转换函数

# 方法2:使用sql的内置转换函数

df_sql = df_sql.select(str('Age'))

df_sql.printSchema()

输出:

root

|-- Age: integer (nullable = true)

SparkSQL提供了很丰富的内置类型转化函数,可以查阅官方文档。

方法三:使用UDF函数完成DataFrame列的类型转换

UDF(User Define Function),即用户自定义函数,用于扩展Spark系统的内置功能。用户可以使用Python等语言编写自己的函数,在SparkSQL中扩展SQL的功能。

# 方法3 :使用udf

from pyspark.sql.functions import udf

def string_to_float(x):

return float(x)

udfstring_to_float = udf(string_to_float, StringType())

df_sql.withColumn("Age",udfstring_to_float("Age") )

df_sql.printSchema()

输出:

root

|-- _c0: string (nullable = true)

|-- Address: string (nullable = true)

|-- Age: integer (nullable = true)

|-- Name: string (nullable = true)

|-- Sex: string (nullable = true)

总结:

以上介绍了几种常用的类型转换方法,Spark还提供了很多其他方法,可以慢慢尝试下。

如果发现任何不正确的地方,或者想分享有关上述主题的更多信息,欢迎反馈。

今日热门