Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark Scala用今天的时间戳填充NA_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark Spark Scala用今天的时间戳填充NA

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

如何替换timestamp类型列中的所有空值

我希望这会更容易,但我似乎无法正确地获取类型。 我假设一个解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳,但是,有更优雅的解决方案吗

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‌​长辞‌​
修复上述代码后,我将再次尝试您的解决方案。感谢您阅读此问题,特别是这一部分:“我假设解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳,但是,有没有更优雅的解决方案?”感谢您阅读此问题,尤其是这一部分:“我假设解决方案是将列转换为字符串,在字符串中填充今天的日期,然后再转换为时间戳