如何修改/转换数据框的列?

Sem*_*ken 3 python apache-spark apache-spark-sql pyspark

我有一个pyspark.sql.dataframe.DataFrame使用创建的实例

dataframe = sqlContext.sql("select * from table").
Run Code Online (Sandbox Code Playgroud)

一列是 'arrival_date' 并包含一个字符串。

如何修改此列以便仅从中取出前 4 个字符并丢弃其余字符?

如何将此列的类型从字符串转换为日期?

在 graphlab.SFrame 中,这将是:

dataframe['column_name'] = dataframe['column_name'].apply(lambda x: x[:4] )
Run Code Online (Sandbox Code Playgroud)

和

dataframe['column_name'] = dataframe['column_name'].str_to_datetime()
Run Code Online (Sandbox Code Playgroud)

Dan*_*ula 6

正如 Orions 所说,您不能修改列,但可以覆盖它。此外,您不需要创建用户定义的函数,因为有一个用于提取子字符串的内置函数:

from pyspark.sql.functions import *
df = df.withColumn("arrival_date", df['arrival_date'].substr(0, 4))
Run Code Online (Sandbox Code Playgroud)

要将其转换为日期,您可以使用to_date,正如 Orions 所说:

from pyspark.sql.functions import *
df = df.withColumn("arrival_date", to_date(df['arrival_date'].substr(0, 4)))
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要指定格式,则应使用unix_timestamp:

from pyspark.sql.functions import *
format = 'yyMM'
col = unix_timestamp(df['arrival_date'].substr(0, 4), format).cast('timestamp')
df = df.withColumn("arrival_date", col)
Run Code Online (Sandbox Code Playgroud)

所有这些都可以在pyspark 文档中找到。