处理Pyspark中的丢失数据

时间:2018-12-26 16:32:13

标签: python apache-spark pyspark

使用PySpark 1.6 / Python 2.7

我具有以下格式的数据,这些数据是从Hive获取的数据帧:

date, stock, price
1388534400, GOOG, 50
1388534400, FB, 60
1388534400, MSFT, 55
1388620800, GOOG, 52
1388620800, FB, 61
1388620800, MSFT, 55

我想以以下格式的json结尾:

GOOG.json:
{
'symbol': 'GOOG',
 'first_epoch': 1388534400,
 'prices': [50, 52, ... ]
}

日期是该日午夜的纪元,我们的数据可以追溯到10年前(8亿多行)。

“数据”列表对应于每个时期的库存值,其中每个随后的时期是前一个时期+ 86400(即第二天)。

这里的问题是可能可能会丢失数据,因此我需要识别出这些缺失点并替换None值。

在本机Python中,我构建了datetime对象的生成器,并将此列表用作有效的历元列表,将其转换为历元。对于每个符号,我遍历有效的历元并将它们与该符号的可用历元进行比较。当检测到缺失的纪元时,返回一个None值(结果类似'prices': [50, 52, None, 49, 51, ... ]。这种方法效果很好,但是我不确定如何在PySpark中实现。

1 个答案:

答案 0 :(得分:0)

如果您缺少某些股票的完整时期,则可以执行以下操作:

  • 获取不同的时期表和不同的库存表
  • 交叉连接那些不同的列表-现在您有了一个包含所有可能值的完整表。将此表称为B
  • 与B一起在右侧的原始表上进行左半连接
  • 所有缺少的行都会丢失股票价格-使用Spark的NaFunctions估算

Pyspark在pyspark.sql.DataFrameNaFunctions()模块中具有完整的Nafunctions目录

DataFrame.fillna()DataFrame.na.fill()可以解决此问题。然后,您可以运行groupBy,然后按纪元对数据进行分组。