Spark Java中的时区转换问题



我想在中央时区插入日期为creatation_date。我更改了jvm时区(US/Central),并创建了时区(timezone)的日期,并能够在本地的情况下插入DB。当主url更改为YARN时它不能正常工作。它插入的时间比中央时区少2小时。我甚至测试了改变Spark Session但同样的结果,它在DB中更新的时间少了2小时

//sparksession timezone change
session.conf().set("spark.sql.session.timezone","US/Central");
TimeZone.setDefault(timeZone.getTimeZone("US/Central"));
Timestamp time = new Timestamp(System.currentTimeMillis());
Dataset<Row> mydata= dataset1.withColumn("Creation_date" , function.lit(time).cast("timestamp"))

使用java 8 API生成所需时区的当前时间,而不是使用系统时间API更改系统时区。LocalDateTime可直接转化为java.sql.Timestamp

import java.time.LocalDateTime
import java.time.ZoneId
import java.sql.Timestamp
import org.apache.spark.sql.functions.lit
Timestamp time= Timestamp.valueOf(LocalDateTime.now(ZoneId.of("US/Central")));
Dataset<Row> mydata= dataset1.withColumn("Creation_date" , lit(time));

在Sparksession中添加两个额外的配置后,它对我来说工作得很好。

注意:当我使用master作为Yarn时,我在DB中面临时差问题,但它工作正常

SparkSession session=SparkSession.builder()
.appName("somename")
.master("yarn")
.config("spark.driver.extraJavaOptions", "-Duser.timezone=US/Central") 
.config("spark.executor.extraJavaOptions", "-Duser.timezone=US/Central") 
.getOrCreate();
session.conf().set("spark.sql.session.timezone","US/Central");
TimeZone.setDefault(timeZone.getTimeZone("US/Central"));
Timestamp time = new Timestamp(System.currentTimeMillis());
Dataset<Row> mydata= dataset1.withColumn("Creation_date" , function.lit(time).cast("timestamp"))

最新更新