如何基于数据类型识别列并在pyspark中进行转换?

时间:2019-10-29 06:44:14

标签: python python-3.x pyspark pyspark-sql pyspark-dataframes

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

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()))

enter image description here

我有一个数据列,其列数据类型如上所示

我想做的就是确定

a)列中包含术语datetime的列,并将其数据类型从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 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

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"))