To_timestamp добавляет +5:30 к моей временной метке STRING ⇐ JAVA
-
Anonymous
To_timestamp добавляет +5:30 к моей временной метке STRING
Я создал следующую функцию, используя набор данных Spark, которая преобразует "даты (гггг-мм-дд)"/"метки времени" на основе STRING в тип данных TIMESTAMP -
/** * Преобразует строку date/datetime в тип данных Timestamp. * * @param df dataframe * Столбцы временных меток @param timestampCols * @return {@link Dataset} измененный фрейм данных */ public static Dataset ConvertTimestampColumns(Dataset df, List timestampCols) { Набор данных модифицированныйDf = df; for (String columnsName: df.columns()) { если (timestampCols.contains(columnName)) { модифицированныйDf = модифицированныйDf.withColumn(имя столбца, to_timestamp(df.col(columnName))); } } модифицированныйDf.show(); вернуть модифицированныйDf; } Но когда я это тестирую -
@Test общественный недействительный testConvertTimestampColumns () { SharedJavaSparkContext javaSparkContext = новый SharedJavaSparkContext (); Набор данных df; попробуйте (SparkSession spark = new SparkSession(javaSparkContext.sc())) { Данные List = Arrays.asList( RowFactory.create(1, "2022-01-01", "2019-03-26T20:28:32.000Z") ); Поля List = Arrays.asList( DataTypes.createStructField("id", DataTypes.IntegerType, true), DataTypes.createStructField("date_col1", DataTypes.StringType, true), DataTypes.createStructField("date_col2", DataTypes.StringType, true) ); Схема StructType = DataTypes.createStructType(поля); df = spark.createDataFrame(данные, схема); } List timestampCols = Arrays.asList("date_col1", "date_col2"); // Конвертируем timestampCols в TimestampType Dataset resultDF = FactSalesforceCRMETLUtils.convertTimestampColumns(df, timestampCols); // Проверяем схему и преобразованные значения Assert.assertEquals(DataTypes.TimestampType, resultDF.schema().fields()[1].dataType()); Assert.assertEquals(DataTypes.TimestampType, resultDF.schema().fields()[2].dataType()); Assert.assertEquals("2022-01-01 00:00:00.0", resultDF.first().getAs("date_col1").toString()); Assert.assertEquals("2019-03-26 20:28:32.0", resultDF.first().getAs("date_col2").toString()); } Мое последнее утверждение не удалось, поскольку функция добавляет +5:30 к предоставленной метке времени STRING.
Я пробовал другие функции, такие как to_utc_timestamp , from_utc_timestamp, предоставляемые Spark, но ничего не помогает.
Нужно ли мне создавать UDF, чтобы решить эту проблему? Или есть что-то внутреннее в Spark, которое может решить мою проблему?
Я создал следующую функцию, используя набор данных Spark, которая преобразует "даты (гггг-мм-дд)"/"метки времени" на основе STRING в тип данных TIMESTAMP -
/** * Преобразует строку date/datetime в тип данных Timestamp. * * @param df dataframe * Столбцы временных меток @param timestampCols * @return {@link Dataset} измененный фрейм данных */ public static Dataset ConvertTimestampColumns(Dataset df, List timestampCols) { Набор данных модифицированныйDf = df; for (String columnsName: df.columns()) { если (timestampCols.contains(columnName)) { модифицированныйDf = модифицированныйDf.withColumn(имя столбца, to_timestamp(df.col(columnName))); } } модифицированныйDf.show(); вернуть модифицированныйDf; } Но когда я это тестирую -
@Test общественный недействительный testConvertTimestampColumns () { SharedJavaSparkContext javaSparkContext = новый SharedJavaSparkContext (); Набор данных df; попробуйте (SparkSession spark = new SparkSession(javaSparkContext.sc())) { Данные List = Arrays.asList( RowFactory.create(1, "2022-01-01", "2019-03-26T20:28:32.000Z") ); Поля List = Arrays.asList( DataTypes.createStructField("id", DataTypes.IntegerType, true), DataTypes.createStructField("date_col1", DataTypes.StringType, true), DataTypes.createStructField("date_col2", DataTypes.StringType, true) ); Схема StructType = DataTypes.createStructType(поля); df = spark.createDataFrame(данные, схема); } List timestampCols = Arrays.asList("date_col1", "date_col2"); // Конвертируем timestampCols в TimestampType Dataset resultDF = FactSalesforceCRMETLUtils.convertTimestampColumns(df, timestampCols); // Проверяем схему и преобразованные значения Assert.assertEquals(DataTypes.TimestampType, resultDF.schema().fields()[1].dataType()); Assert.assertEquals(DataTypes.TimestampType, resultDF.schema().fields()[2].dataType()); Assert.assertEquals("2022-01-01 00:00:00.0", resultDF.first().getAs("date_col1").toString()); Assert.assertEquals("2019-03-26 20:28:32.0", resultDF.first().getAs("date_col2").toString()); } Мое последнее утверждение не удалось, поскольку функция добавляет +5:30 к предоставленной метке времени STRING.
Я пробовал другие функции, такие как to_utc_timestamp , from_utc_timestamp, предоставляемые Spark, но ничего не помогает.
Нужно ли мне создавать UDF, чтобы решить эту проблему? Или есть что-то внутреннее в Spark, которое может решить мою проблему?
Мобильная версия