定义pyspark表,列类型为timestamp

xesrikrc  于 2023-04-29  发布在  Spark
关注(0)|答案(1)|浏览(122)

我需要为一些单元测试创建一个PySpark数据框架。dataframe中的一个列需要是TimestampType类型。下面的代码可以定义dataframe:

spark = (SparkSession
            .builder
            .master("local[*]")
            .appName("Unit-tests")
            .getOrCreate())

data = [
            ("2023-04-25 00:00:00", "A", 100.5),
            ("2023-04-26 00:00:00", "A", 110.0),
            ("2023-04-28 00:00:00", "A", 105.0),
            ("2023-04-27 00:00:00", "B", 50.5),
            ("2023-04-29 00:00:00", "B", 55.5),
        ]

schema = StructType([
            StructField("time", TimestampType(), True), \
            StructField("id", StringType(), True), \
            StructField("value", DoubleType(), True)
        ])

df = spark.createDataFrame(
            data=data,
            schema=schema
        )

但是,这给了我一个TypeError:field time: TimestampType() can not accept object '2023-04-25 00:00:00' in type
我知道一种解决方法,首先将time列定义为StringType,然后通过添加以下代码将其转换为TimestampType
df.withColumn("time", col("time").cast(TimestampType()))
但这似乎是一种相当麻烦的方法。如何在模式中直接定义它?

jv4diomz

jv4diomz1#

此错误是因为TimestampType需要Timestamp类型而不是str。这可以通过在Python中使用datetime来导出。
你只需要像这样定义你的数据:

from datetime import datetime
spark = (SparkSession
        .builder
        .master("local[*]")
        .appName("Unit-tests")
        .getOrCreate())

data = [
        (datetime.strptime("2023-04-25 00:00:00", '%Y-%m-%d %H:%M:%S'), "A", 100.5),
        (datetime.strptime("2023-04-26 00:00:00", '%Y-%m-%d %H:%M:%S'), "A", 110.0),
        (datetime.strptime("2023-04-28 00:00:00", '%Y-%m-%d %H:%M:%S'), "A", 105.0),
        (datetime.strptime("2023-04-27 00:00:00", '%Y-%m-%d %H:%M:%S'), "B", 50.5),
        (datetime.strptime("2023-04-29 00:00:00", '%Y-%m-%d %H:%M:%S'), "B", 55.5),
    ]

schema = StructType([
        StructField("time", TimestampType(), True), \
        StructField("id", StringType(), True), \
        StructField("value", DoubleType(), True)
    ])

df = spark.createDataFrame(
        data=data,
        schema=schema
    )

相关问题