如何在类型的时间戳?
的一列中替换所有空值?我希望这会更容易,但是我似乎无法正确获得类型。我认为解决方案是将列转换为字符串,在字符串中填充日期,然后重新转换为时间戳,但是是否有更优雅的解决方案?
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|
+-------------------+