相关疑难解决方法(0)

Spark/Scala:前进填充最后一次观察

使用Spark 1.4.0,Scala 2.10

我一直试图找出一种方法来使用最后一次已知的观察来转发填充空值,但我没有看到一种简单的方法.我认为这是一件非常常见的事情,但找不到显示如何执行此操作的示例.

我看到函数向前转移填充NaN的值,或滞后/超前函数来填充或移位数据偏移量,但没有任何东西可以获取最后的已知值.

在线查看,我在R中看到很多关于同一件事的Q/A,但在Spark/Scala中没有.

我正在考虑在日期范围内进行映射,从结果中过滤出NaN并选择最后一个元素,但我想我对语法感到困惑.

使用DataFrames我尝试类似的东西

import org.apache.spark.sql.expressions.Window

val sqlContext = new HiveContext(sc)

var spec = Window.orderBy("Date")
val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").load("test.csv")

val df2 = df.withColumn("testForwardFill", (90 to 0).map(i=>lag(df.col("myValue"),i,0).over(spec)).filter(p=>p.getItem.isNotNull).last)
Run Code Online (Sandbox Code Playgroud)

但这并没有让我任何地方.

过滤器部分不起作用; map函数返回一个spark.sql.Columns序列,但是filter函数需要返回一个Boolean,所以我需要从Column中获取一个值来测试,但似乎只有Column方法返回一个Column.

有没有办法在Spark上更"简单"地做到这一点?

感谢您的输入

编辑:

简单示例示例输入:

2015-06-01,33
2015-06-02,
2015-06-03,
2015-06-04,
2015-06-05,22
2015-06-06,
2015-06-07,
...
Run Code Online (Sandbox Code Playgroud)

预期产量:

2015-06-01,33
2015-06-02,33
2015-06-03,33
2015-06-04,33
2015-06-05,22
2015-06-06,22
2015-06-07,22
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 我有很多列,其中许多都有这种缺失的数据模式,但不是在相同的日期/时间.如果我需要,我将一次完成一列变换.

编辑:

按照@ zero323的回答我试过这样:

    import org.apache.spark.sql.Row
    import org.apache.spark.rdd.RDD

    val rows: RDD[Row] = df.orderBy($"Date").rdd


    def notMissing(row: Row): Boolean = { !row.isNullAt(1) } …
Run Code Online (Sandbox Code Playgroud)

scala apache-spark apache-spark-sql

26
推荐指数
1
解决办法
8269
查看次数

在Spark / Python中向前填充缺少的值

我试图用以前的非空值(如果存在)填充我的Spark数据框中的缺失值。我已经在Python / Pandas中完成了这类工作,但是我的数据对于Pandas(在一个小型集群上)来说太大了,我是Spark noob。这是Spark可以做的吗?可以为多列使用吗?如果是这样,怎么办?如果没有,在谁的Hadoop工具套件中对替代方法有何建议?

谢谢!

hadoop apache-spark pyspark spark-dataframe apache-spark-mllib

6
推荐指数
1
解决办法
2762
查看次数

Pyspark - 如何回填数据帧?

你怎么能做与df.fillna(method='bfill')带有 的熊猫数据框相同的事情pyspark.sql.DataFrame

pyspark 数据框具有该pyspark.sql.DataFrame.fillna方法,但不支持method参数。


在 Pandas 中,您可以使用以下内容回填时间序列:

创建数据

import pandas as pd

index = pd.date_range('2017-01-01', '2017-01-05')
data = [1, 2, 3, None, 5]

df = pd.DataFrame({'data': data}, index=index)
Run Code Online (Sandbox Code Playgroud)

给予

Out[1]:
            data
2017-01-01  1.0
2017-01-02  2.0
2017-01-03  3.0
2017-01-04  NaN
2017-01-05  5.0
Run Code Online (Sandbox Code Playgroud)

回填数据框

df = df.fillna(method='bfill')
Run Code Online (Sandbox Code Playgroud)

生成回填框架

Out[2]:
            data
2017-01-01  1.0
2017-01-02  2.0
2017-01-03  3.0
2017-01-04  5.0
2017-01-05  5.0
Run Code Online (Sandbox Code Playgroud)

如何为 a 做同样的事情pyspark.sql.DataFrame

pandas pyspark spark-dataframe pyspark-sql

6
推荐指数
2
解决办法
4271
查看次数

在Spark中使用前导窗口功能时是否可以忽略空值

我的数据框是这样的

id  value  date    
1   100    2017 
1   null   2016 
1   20     2015 
1   100    2014
Run Code Online (Sandbox Code Playgroud)

我想获取最新的先前值,但忽略null

id  value  date   recent value
1   100    2017    20
1   null   2016    20
1   20     2015   100
1   100    2014   null
Run Code Online (Sandbox Code Playgroud)

使用引导窗口功能时,有什么方法可以忽略空值。

scala apache-spark apache-spark-sql

3
推荐指数
1
解决办法
2536
查看次数