Apache spark Spark Scala用今天的时间戳填充NA
如何替换timestamp类型列中的所有空值 我希望这会更容易,但我似乎无法正确地获取类型。 我假设一个解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳,但是,有更优雅的解决方案吗Apache spark Spark Scala用今天的时间戳填充NA,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,如何替换timestamp类型列中的所有空值 我希望这会更容易,但我似乎无法正确地获取类型。 我假设一个解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳,但是,有更优雅的解决方案吗 val today=java.time.LocalDate.now() var todayStamp=java.sql.Timestamp.valueOf(today.atStartOfDay()); df=df.na.fill(映射(“到期”->todayStamp)) 导致 java.l
val today=java.time.LocalDate.now()
var todayStamp=java.sql.Timestamp.valueOf(today.atStartOfDay());
df=df.na.fill(映射(“到期”->todayStamp))
导致
java.lang.IllegalArgumentException: Unsupported value type java.sql.Timestamp
使用“今天”和使用unix\u timestamp(string).cast(“timestamp”)
应为列而不是字符串。我想我可以用上面提到的“丑陋”的方法
稍后编辑:
忘记提及,在时间戳列上使用Int或String和df.na.fill方法也会导致错误:
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];
你可以让它变得简单:
import org.apache.spark.sql.functions._
df.withColumn("expiration",
when($"expiration".isNull, current_timestamp()).otherwise($"expiration"))
你可以让它变得简单:
import org.apache.spark.sql.functions._
df.withColumn("expiration",
when($"expiration".isNull, current_timestamp()).otherwise($"expiration"))
根据该文件: 该值必须为以下类型:整型、长型、浮点型、双精度、字符串型、布尔型替换值被强制转换为列数据类型。 使用na.fill-您需要提供整数、长或字符串形式的日期,如果列的类型为“timestamp”,则它可能会自动转换为“timestamp” 填充
public Dataset<Row> fill(java.util.Map<String,Object> valueMap)
根据该文件: 该值必须为以下类型:整型、长型、浮点型、双精度、字符串型、布尔型替换值被强制转换为列数据类型。 使用na.fill-您需要提供整数、长或字符串形式的日期,如果列的类型为“timestamp”,则它可能会自动转换为“timestamp” 填充
public Dataset<Row> fill(java.util.Map<String,Object> valueMap)
您还可以使用:
import org.apache.spark.sql.functions_
df.withColumn(“到期”),coalesce(col(“到期”),current_timestamp())
下面是一个可复制的示例:
import org.apache.spark.sql.functions_
val df=Seq(
Tuple1(无:选项[时间戳]),
Tuple1(一些(Timestamp.valueOf(“2010-01-01 00:00:00”))
).toDF(“到期”)
df.withColumn(“过期”),coalesce(col(“过期”),current_timestamp()).show()
您还可以使用:
import org.apache.spark.sql.functions_
df.withColumn(“到期”),coalesce(col(“到期”),current_timestamp())
下面是一个可复制的示例:
import org.apache.spark.sql.functions_
val df=Seq(
Tuple1(无:选项[时间戳]),
Tuple1(一些(Timestamp.valueOf(“2010-01-01 00:00:00”))
).toDF(“到期”)
df.withColumn(“过期”),coalesce(col(“过期”),current_timestamp()).show()
在Java中,我可以这样做:首先将列值强制转换为字符串,然后使用df.na()将空字符串替换为默认值,然后将列强制转换回时间戳
输入数据
+-------------------+
| 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|
+-------------------+
我可以在Java中通过先将列值转换为String,然后使用df.na()替换空字符串,然后将列转换为时间戳 输入数据
+-------------------+
| 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|
+-------------------+
我想我忘了在最初的帖子里写。尝试使用值0填充na.fill会出现错误:
org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析“coalesce(
expiration,0)”:函数coalesce的输入应该是相同的类型,但它是[timestamp,int]代码>我在发帖前确实读过这些文档,但是谢谢你的更新,我想我忘记在最初的帖子中写了。尝试使用值0填充na.fill会出现错误:org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析“coalesce(
expiration,0)”:函数coalesce的输入应该是相同的类型,但它是[timestamp,int]
我在发布之前确实阅读了文档,但感谢您的更新。不幸的是,此解决方案会产生以下故障:java.lang.UnsupportedOperationException:org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
(点击enter太早,没有编辑权限,sry)@UrVal这很奇怪。我的代码中有一个输入错误,希望这是导致您出现问题的原因否:)我在运行之前已修复了该问题,但问题出现的原因是我必须处理的数据。您推荐的代码可能仍然很好,但我必须首先找到解决上述问题的方法。不幸的是,此解决方案会导致以下失败:java.lang.UnsupportedOperationException:org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
(过早地按enter键,并且没有编辑权限,sry)@乌瓦尔:真奇怪。我的代码中有一个输入错误,希望这是导致您出现问题的原因否:)我在运行之前已修复了该问题,但问题出现的原因是我必须处理的数据。您推荐的代码可能仍然很好,但我必须首先找到解决上述问题的方法这更优雅,但我现在有一个不同的错误java.lang.UnsupportedOperationException:org.apache.parquet.column.values.dictionary.PlainValuesDictioni长辞我将在修复上面的代码后再次尝试您的解决方案这更优雅,但我现在有一个不同的错误java.lang.UnsupportedOperationException:org.apache.parquet.column.values.dictionary.PlainValuesDictionary.Distici长辞
修复上述代码后,我将再次尝试您的解决方案。感谢您阅读此问题,特别是这一部分:“我假设解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳,但是,有没有更优雅的解决方案?”感谢您阅读此问题,尤其是这一部分:“我假设解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳