Spark Scala填充NA,今天的时间戳



如何在类型的时间戳?

的一列中替换所有空值?

我希望这会更容易,但是我似乎无法正确获得类型。我认为解决方案是将列转换为字符串,在字符串中填充日期,然后重新转换为时间戳,但是是否有更优雅的解决方案?

val today = java.time.LocalDate.now()
var todayStamp = java.sql.Timestamp.valueOf(today.atStartOfDay());
df = df.na.fill(Map("expiration" -> todayStamp))

导致

java.lang.IllegalArgumentException: Unsupported value type java.sql.Timestamp

今天使用也不起作用,并使用unix_timestamp(string).cast("timestamp")期望列而不是字符串。我认为我可以在上面提到的"丑陋"方法中使用它。

以后的编辑:忘了在时间戳列上使用df.na.fill方法使用int或字符串也会导致错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'coalesce(expiration, 0)' due to data type mismatch: input to function coalesce should all be the same type, but it's [timestamp, int];

您也可以使用cocece:

import org.apache.spark.sql.functions._
df.withColumn("expiration", coalesce(col("expiration"), current_timestamp()))

这是一个可重现的示例:

import org.apache.spark.sql.functions._
val df = Seq(
  Tuple1(None: Option[Timestamp]),
  Tuple1(Some(Timestamp.valueOf("2010-01-01 00:00:00")))
).toDF("expiration")
df.withColumn("expiration", coalesce(col("expiration"), current_timestamp())).show()

根据文档:

值必须是以下类型:整数,长,float,double,string,boolean 替换值被施放为列数据类型。

使用na.fill-您需要提供日期为整数,长或字符串,如果列是类型为" Timestamp"的列,它将自动施放为" Timestamp"

https://spark.apache.org/docs/latest/api/java/java/org/apache/spark/spark/sql/dataframenafunctions.html

填充

public Dataset<Row> fill(java.util.Map<String,Object> valueMap)

返回一个替代空值的新数据框。

地图的密钥是列名称,地图的值是替换值。值必须具有以下类型:整数,长,float,double,string,boolean 替换值被施加到列数据类型

例如,以下替换了列中的null值," a" a" a"带有字符串"未知"的null值,而列中的null值则替换为" b"列中的null值1.0。

import com.google.common.collect.ImmutableMap;
df.na.fill(ImmutableMap.of("A", "unknown", "B", 1.0));

您可以使其简单:

import org.apache.spark.sql.functions._
df.withColumn("expiration", 
  when($"expiration".isNull, current_timestamp()).otherwise($"expiration"))

我可以在Java中通过将列值施加到字符串中,然后使用df.na()将null字符串替换为null字符串,然后将列作为时间戳施放。p>输入数据

+-------------------+
|               date|
+-------------------+
|               null|
|2018-04-03 00:00:00|
+-------------------+

我的转换

df.withColumn(
    "stringDate", 
    col("date").cast(DataTypes.StringType))
        .na().fill("2018-04-01 00:00:00")
        .withColumn("finalDate", col("stringDate").cast(DataTypes.TimestampType))
        .select("finalDate");

最终输出

+-------------------+
|          finalDate|
+-------------------+
|2018-04-01 00:00:00|
|2018-04-03 00:00:00|
+-------------------+

最新更新