如何根据数据类型识别列并在pyspark中转换它们?

Posted

技术标签:

【中文标题】如何根据数据类型识别列并在pyspark中转换它们?【英文标题】:How to identify columns based on datatype and convert them in pyspark? 【发布时间】:2019-10-29 06:44:14 【问题描述】:

我有一个如下所示的数据框

df = pd.DataFrame(
'date':['11/12/2001','11/12/2002','11/12/2003','11/12/2004','11/12/2005','11/12/2006'],
'readings' : ['READ_1','READ_2','READ_1','READ_3','READ_4','READ_5'],
 'val_date' :['21/12/2001','22/12/2002','23/12/2003','24/12/2004','25/12/2005','26/12/2006'],
 )
spark_df = spark.createDataFrame(df)
spark_df = spark_df.withColumn("date", spark_df["date"].cast(TimestampType()))
spark_df = spark_df.withColumn("val_date", spark_df["val_date"].cast(TimestampType()))

我有一个列数据类型如上所示的数据框

我想做的是识别

a) 名称中包含术语date,time 的列,并将其数据类型从Timestamp/Datetime 转换为string

b) 根据TimestampDatetime 数据类型识别列并将它们转换为string 类型

虽然下面的方法有效,但这并不优雅和高效。我有超过 3k 列,无法逐行执行此操作

spark_df = spark_df.withColumn("date", spark_df["date"].cast(StringType()))
spark_df = spark_df.withColumn("val_date", spark_df["val_date"].cast(StringType()))

我也在下面尝试过,但没有帮助

selected = [c.cast(StringType()) for c in spark_df.columns if ('date') in c]+['time']
spark_df.select(selected)

是否可以根据上面给出的条件ab 来识别列并一次性转换它们?

您用至少一种方法解决此问题的意见会有所帮助

【问题讨论】:

【参考方案1】:

您可以执行以下操作:

from pyspark.sql.functions import col

schema = col: col_type for col, col_type in df.dtypes
time_cols = [col for col, col_type in schema.items() if col_type in "timestamp date".split() or "date" in col or "time" in col]

for column in time_cols:
    df = df.withColumn(column, col(column).cast("string"))

【讨论】:

以上是关于如何根据数据类型识别列并在pyspark中转换它们?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pyspark 中,我如何比较两列并在它们不相同时使用 x

向数据框添加列并在 pyspark 中更新

如何从pyspark数据框列值中删除方括号

如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?

Python 数据类型到 pyspark.sql.types 的自动转换

如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示