使用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)
注意:
编辑:
按照@ 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) 我试图用以前的非空值(如果存在)填充我的Spark数据框中的缺失值。我已经在Python / Pandas中完成了这类工作,但是我的数据对于Pandas(在一个小型集群上)来说太大了,我是Spark noob。这是Spark可以做的吗?可以为多列使用吗?如果是这样,怎么办?如果没有,在谁的Hadoop工具套件中对替代方法有何建议?
谢谢!
hadoop apache-spark pyspark spark-dataframe apache-spark-mllib
你怎么能做与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?
我的数据框是这样的
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)
使用引导窗口功能时,有什么方法可以忽略空值。