pyspark 时间戳更改TestCase中的区域

a5g8bdjr  于 2023-05-06  发布在  Spark
关注(0)|答案(1)|浏览(146)

我试图测试一些函数,其中操纵一个pyspark Dataframe 。我使用Python中的unittest库来实现这一点。下面是我的setUp函数:

class TestMyClass(TestCase):

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

        self.data = [
            (datetime(2023, 4, 25, 0, 0, 0), "A", 100.5),
            (datetime(2023, 4, 26, 0, 0, 0), "A", 110.0),
            (datetime(2023, 4, 28, 0, 0, 0), "A", 105.0),
            (datetime(2023, 4, 25, 0, 0, 0), "B", 50.5),
            (datetime(2023, 4, 27, 0, 0, 0), "B", 55.5),
                ]

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

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

然而,当我尝试调试代码时,我注意到time列中的时间戳被转换为两个小时前的时间,因此转换为22:00:00。但是,如果我在setUp函数中使用相同的代码,并删除self.,并在笔记本中执行,时间不会改变。TestCase类是否内置了一些时区敏感性?我该怎么避免呢?

xzv2uavs

xzv2uavs1#

只有unix epoch不受时区的影响,因为它只是自1970年1月1日(UTC/GMT午夜)以来经过的秒数。
你的datetime对象和Spark应用程序都将受到运行机器的时区设置的影响。您可以:
1.使用unix epoch
1.使用Spark SQL时,通过设置spark.sql.session.timeZone来配置spark应用程序的时区。例如,您可以在需要UTC+8时区时设置Asia/Hong_Kong

相关问题